如何将PostgreSQL“GRANT ALL ON ALL TABLES”应用于新表?

Ken*_*Ken 8 postgresql user-management

正如在GRANT SELECT 对 postgresql 中的所有表的问题中所讨论的那样,从 PG 9.0 开始,您可以使用如下命令将所有现有表的权限批量授予用户 u:

GRANT ALL ON ALL TABLES IN SCHEMA public TO u;
Run Code Online (Sandbox Code Playgroud)

以 u 身份登录,您现在可以对预先存在的表 a 执行此操作:

SELECT * FROM a;
Run Code Online (Sandbox Code Playgroud)

但是,如果您现在创建表 b 并执行以下操作:

SELECT * FROM b;
Run Code Online (Sandbox Code Playgroud)

你得到:

ERROR: permission denied for relation b
SQL state: 42501
Run Code Online (Sandbox Code Playgroud)

这可以通过重新执行来解决

GRANT ALL ON ALL TABLES IN SCHEMA public TO u;
Run Code Online (Sandbox Code Playgroud)

但是每次创建表后都必须记住这样做是一个问题。

有没有办法让 PostgreSQL 自动将这些全局授权应用于新创建的表?

~ 提前致谢 ~ 肯

Fed*_*rra 11

一个可能的解决方案是更改u用户的默认权限:

例如:

alter default privileges in schema public grant all on tables to u;
alter default privileges in schema public grant all on sequences to u;
Run Code Online (Sandbox Code Playgroud)

描述

ALTER DEFAULT PRIVILEGES允许您设置将应用于将来创建的对象的权限。(它不影响分配给已存在对象的权限。)目前,只能更改表(包括视图)、序列和函数的权限。

您只能更改将由您自己或您所属的角色创建的对象的默认权限。可以全局设置权限(即,针对当前数据库中创建的所有对象),或仅针对在指定模式中创建的对象。每个模式指定的默认权限被添加到特定对象类型的全局默认权限中。

正如下面所解释的GRANT,任何对象类型的默认权限通常都将所有可授予的权限授予对象所有者,并且也可能授予某些权限PUBLIC。但是,可以通过更改全局默认权限来更改此行为ALTER DEFAULT PRIVILEGES

请参阅:更改默认权限