正如在问题中讨论的那样GRANT SELECT 到 postgresql 中的所有表从 PG 9.0 开始,您可以批量授予所有权限现存的表给用户 u,使用如下命令:
GRANT ALL ON ALL TABLES IN SCHEMA public TO u;
以 u 身份登录后,您现在可以对预先存在的表 a 执行此操作:
SELECT * FROM a;
但是如果你现在创建表 b 并执行:
SELECT * FROM b;
你得到:
ERROR: permission denied for relation b
SQL state: 42501
可以通过重新执行来解决
GRANT ALL ON ALL TABLES IN SCHEMA public TO u;
但每次创建表后都必须记住执行此操作,这是一个问题。
有没有办法让 PostgreSQL 自动将这些全局授权应用于新创建的表?
~ 提前致谢 ~ Ken
答案1
一个可能的解决方案是改变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;
描述
ALTER DEFAULT PRIVILEGES
允许您设置将应用于将来创建的对象的权限。(它不会影响分配给已存在对象的权限。)目前,只能更改表(包括视图)、序列和函数的权限。您只能更改您自己或您所属角色所创建对象的默认权限。权限可以全局设置(即,针对当前数据库中创建的所有对象),也可以只针对在指定架构中创建的对象设置。每个架构指定的默认权限将添加到特定对象类型的全局默认权限中。
如下所述
GRANT
,任何对象类型的默认权限通常都会向对象所有者授予所有可授予的权限,也可能向授予者授予一些权限PUBLIC
。但是,可以通过使用 更改全局默认权限来更改此行为ALTER DEFAULT PRIVILEGES
。
看:修改默认权限