您发现了为给定架构中的所有现有表设置特权的快捷方式。该手册阐明:
(但请注意,它ALL TABLES
被认为包括视图和外部表)。
大胆强调我的。serial
列是nextval()
通过序列默认列实现的,并引用手册:
对于序列,此特权允许使用currval
和nextval
函数。
因此,如果有serial
列,您还需要在序列上授予USAGE
(或ALL PRIVILEGES
)
GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;
注意:Postgres 10或更高版本中的标识列使用不需要附加特权的隐式序列。(考虑升级serial
列。)
怎么样的新对象?
您还将DEFAULT PRIVILEGES
对用户或模式感兴趣:
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;
这将为将来自动创建的对象设置特权,但不会为先前存在的对象设置特权。
默认特权仅适用于目标用户(FOR ROLE my_creating_role
)创建的对象。如果省略该子句,则默认为当前用户正在执行ALTER DEFAULT PRIVILEGES
。明确地说:
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;
还要注意,所有版本的pgAdmin III都有一个细微的错误,即使它们不适用于当前角色,它也会在SQL窗格中显示默认权限。FOR ROLE
复制SQL脚本时,请确保手动调整该子句。