ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# ALTER DEFAULT PRIVILEGES ## Name ALTER DEFAULT PRIVILEGES -- 定义默认的访问权限 ## Synopsis ``` ALTER DEFAULT PRIVILEGES [ FOR { ROLE | USER } _target_role_ [, ...] ] [ IN SCHEMA _schema_name_ [, ...] ] _abbreviated_grant_or_revoke_ where `_abbreviated_grant_or_revoke_` is one of: GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON TABLES TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON SEQUENCES TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTIONS TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPES TO { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ WITH GRANT OPTION ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON TABLES FROM { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON SEQUENCES FROM { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTIONS FROM { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPES FROM { [ GROUP ] _role_name_ | PUBLIC } [, ...] [ CASCADE | RESTRICT ] ``` ## 描述 `ALTER DEFAULT PRIVILEGES` 允许你设置应用到以后创建的对象的权限. (这不影响已分配给已经存在对象的权限.) 目前, 只有表(包括视图和外部表)、序列、函数 和类型(包括域)的权限能够被更改. 你能修改那些会被你自己或那些你是其中一员的角色所创建的对象的默认权限. 这个权限能被全局设置 (比如:给所有在当前数据库创建的对象), 或者只是给在指定模式中创建的对象. 默认权限规定每个模式的都会被加上,无论全局默认权限是不是为了特殊的对象类型. 根据 [GRANT](#calibre_link-19)下的解释, 任何对象类型的默认权限通常授权全部可授与权限给对象所有者 , 以及授权一些权限给 `PUBLIC` . 不管怎样 , 改行为能通过使用`ALTER DEFAULT PRIVILEGES`更改全局默认权限来修改. ### 参数 `_target_role_` 已经存在并且是一个成员的前角色的名称. 如果 `FOR ROLE`被省略, 这个当前角色是假设的. `_schema_name_` 已存在模式的名称. 如果特别指定,随后在该模式里创建的对象,会被修改为默认权限. 如果 `IN SCHEMA`被省略了,全局默认权限也被更改了. `_role_name_` 已存在的用来授权或撤销权限的角色的名称. 这个参数,和所有其他在 `_abbreviated_grant_or_revoke_`中的参数, 作用如 [GRANT](#calibre_link-19) 或 [REVOKE](#calibre_link-20)所述, 是给整个类的对象而不是特定的命名对象设置权限. ## 备注 使用[psql](#calibre_link-23)'s `\ddp` 命令 来获取已存在的默认权限的分配信息. 权限制的含义与[GRANT](#calibre_link-19)下`\dp`的解释相同。 如果你希望删除一个默认权限已经被修改的角色, 对这个角色来说,撤销默认权限上的修改 或者使用 `DROP OWNED BY` 来摆脱该角色的默认权限默认权限条目,这是必要的. ## 示例 给你后来在模式`myschema`里创建的所有表(和视图)授予SELECT 权限 , 并且允许角色 `webuser`对他们执行INSERT: ``` ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT INSERT ON TABLES TO webuser; ``` 撤销上面的操作, 因此后来创建的表不会拥有比常规情况还多的权限 : ``` ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE SELECT ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE INSERT ON TABLES FROM webuser; ``` 为角色`admin`之后创建的所有的函数,移除那些通常授权在函数上的公共EXECUTE 权限: ``` ALTER DEFAULT PRIVILEGES FOR ROLE admin REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; ``` ## 兼容性 在SQL标准中没有`ALTER DEFAULT PRIVILEGES`语句. ## 请参阅 [GRANT](#calibre_link-19), [REVOKE](#calibre_link-20)