我还希望这笔赠款在将来也能持续创建新表。[...] 我已经翻阅了文档,但似乎找不到合适的解决方案。
因为在 9.0 之前没有。您所能得到的只是为现有表设置权限。你必须为每张桌子做一个GRANT
,因为在 9.0 之前没有“批量”模式。请参阅8.4和9.0的 SQL 语法:
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');