我希望这个授权能够持续适用于未来的新建表,但是我已经查遍了文档,似乎找不到合适的解决方案。
因为在9.0之前没有类似功能,您只能为已存在的表设置权限。在9.0之前,您必须为每个表执行一个GRANT
操作,因为没有"批量"模式可用。请参见8.4和9.0版本的SQL语法:8.4 和 9.0:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] tablename [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
这里是 9.0:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
你所缺少的是新的ALL TABLES IN SCHEMA
部分。
此外,像你在问题中提到的在数据库级别设置权限是不会帮助你的:你只会设置数据库上的权限,但不会对任何"包含"的内容如表进行设置。相关部分:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE dbname [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
这意味着你只能在数据库本身上设置
CREATE
、
CONNECT
和
TEMP
权限,但不能设置
SELECT
、
INSERT
等权限。
至于可行的方法,您可以采取以下措施:
这样的查询可能如下所示:
select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;'
from information_schema.tables
where
table_type = 'BASE TABLE' and
table_schema not in ('pg_catalog', 'information_schema');