Права на таблицу созданную другим пользователем

Помогите разобраться с проблемой.

Есть БД с двумя схемами. Созданы две идентичные роли:

GRANT ALL ON SCHEMA schema_1

GRANT ALL ON SCHEMA schema_2

GRANT ALL ON ALL TABLES IN SCHEMA schema_1

GRANT ALL ON ALL TABLES IN SCHEMA schema_2

ALTER DEFAULT PRIVILEGES IN SCHEMA schema_1 GRANT ALL ON TABLES

ALTER DEFAULT PRIVILEGES IN SCHEMA schema_2 GRANT ALL ON TABLES

но при создании таблицы в одной из схем одной ролью, у другой роли нет никаких прав на нее:

ERROR: permission denied for table


Ответы (1 шт):

Автор решения: Мелкий

Синтаксис ALTER DEFAULT PRIVILEGES гласит:

 ALTER DEFAULT PRIVILEGES
     [ FOR { ROLE | USER } target_role [, ...] ]
     [ IN SCHEMA schema_name [, ...] ]
     abbreviated_grant_or_revoke

где target_role:

Change default privileges for objects created by the target_role, or the current role if unspecified.

Поведение задокументированное. И оно отличается от прямого "интуитивного" прочтения текста команды.

ALTER DEFAULT PRIVILEGES IN SCHEMA schema_1 GRANT ALL ON TABLES TO <role_name>;

Не означает "автоматически добавить GRANT ALL ON TABLE TO <role_name> при создании таблиц в схеме schema_1". А означает команду:

ALTER DEFAULT PRIVILEGES FOR USER CURRENT_USER IN SCHEMA schema_1 GRANT ALL ON TABLES TO <role_name>;

из которой было опущено подразумеваемое по-умолчанию выражение FOR USER CURRENT_USER.

То есть, это ALTER DEFAULT PRIVILEGES правило применяется только при create table, выполняемом в схеме schema_1 и только при выполнении от имени того же самого пользователя, который этот ALTER DEFAULT PRIVILEGES скомандовал.

Чтобы ALTER DEFAULT PRIVILEGES применялся для create table выполненного от имени другого пользователя - для этого пользователя должен быть соответствующий ALTER DEFAULT PRIVILEGES

ALTER DEFAULT PRIVILEGES FOR USER user1 IN SCHEMA schema_1 GRANT ALL ON TABLES TO user2;
ALTER DEFAULT PRIVILEGES FOR USER user2 IN SCHEMA schema_1 GRANT ALL ON TABLES TO user1;

Эквивалента ALTER DEFAULT PRIVILEGES FOR USER ANY нет. ALTER DEFAULT PRIVILEGES должен быть явно указан для каждого пользователя, который может создавать таблицы.


PS: GRANT ALL - мысль довольно неудачная и будет вести к приключениям. Продумайте свою модель прав ещё раз.

→ Ссылка