Я работаю над базой данных Amazon RDS postgresql, где я знаю, что была какая-то проблема с общедоступной схемой (возможно, она была удалена). Но, видимо, схема существует, и в любом случае проблема не решена. Вот пример сеанса с недавно созданной пустой базой данных:
mydb=> CREATE TABLE distributors (
mydb(> did integer,
mydb(> name varchar(40) UNIQUE
mydb(> );
ERROR: no schema has been selected to create in
mydb=> show search_path;
search_path
----------------
"$user",public
(1 row)
mydb=> create schema public;
ERROR: schema "public" already exists
Любой намек? Что я должен искать?
Решаемые. Благодаря ответу Даниэля Верите я решил следующее:
grant usage on schema public to public;
grant create on schema public to public;
Это разрешения по умолчанию для общедоступной схемы?
У меня есть один пользователь, который может получить доступ к базе данных, так что я думаю, что в любом случае это не может повысить риски безопасности
Я думаю, что я должен сделать такую же модификацию на template1 . Это правильно? Как я могу проверить правильность разрешений в template1 (скажем, значения по умолчанию)?
postgresql
schema
amazon-rds
Эмануэле Паолини
источник
источник
Ответы:
Это происходит, когда у вас нет
USAGE
прав доступа ни к одной из схемsearch_path
. По умолчанию псевдоролевая рольpublic
(все пользователи) имеет эту привилегию вpublic
схеме, поэтому эта ошибка возникает только после явного ее отзыва с помощью:Это необходимо, когда нежелательно, чтобы люди заглядывали в схемы других людей, даже не выбирая данные из таблиц (что предоставляется с помощью других привилегий).
Если это
REVOKE
не было сделано в этой базе данных, это могло произойти в базе данных шаблонов, с помощью которой моделируются новые базы данных (см.CREATE DATABASE
).Когда пользователь имеет
USAGE
привилегию, но не имеетCREATE
привилегии в схеме, при попытке создать объект возникает другая ошибка: в доступе к схеме отказано в общедоступной схеме .Чтобы проверить привилегии внутри psql, используйте
\dn+ public
.По умолчанию (показывается с расширенным дисплеем
\x
для удобства чтения):Отсутствие роли перед именем
=
означает, что это для всех ролей (= public)Без публичной привилегии USAGE
Без публичных привилегий USAGE или CREATE
источник
У меня был файл pgdump с созданием функций в настраиваемой схеме, и я хотел переключить имя настраиваемой схемы на общедоступную и заменил все вхождения старой схемой на пустую (например, myschema.tablename на tablename) И начал получать ошибку
Для моего случая ошибка происходит, когда в начале дампа присутствует строка
Я изменил второй аргумент в «public»
И проблема ушла
источник