↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

GRANT

GRANT — 定义访问权限

大纲

GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...]

GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTION funcname ([type, ...]) [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE langname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...]

GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schemaname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...]

描述

GRANT命令把对象(表、视图、序列、数据库、函数、过程语言或模式)上的特定权限授予一个或多个用户或用户组。这些权限会叠加在已有权限(如果有)之上。

关键字PUBLIC表示权限将授予所有用户,包括以后可能创建的用户。可以把PUBLIC看作一个隐式定义的、始终包含所有用户的组。注意,任何特定用户所拥有的权限,是他直接被授予的权限、他被授予的当前所属各组的权限,以及授予PUBLIC的权限之和。

无需把权限授予对象的创建者,因为创建者默认拥有所有权限。(不过,创建者也可以出于安全考虑选择撤销他自己的某些权限。)注意,授予和撤销权限的能力是创建者固有的,不会丢失。删除对象或以任何方式更改对象的权利(不属于可授予的权限)同样是创建者固有的,不能被授予或撤销。

取决于对象的类型,初始的默认权限可能包括把某些权限授予PUBLIC。默认情况下:表和模式没有公共访问权限;数据库有创建TEMP(临时)表的权限;函数有EXECUTE权限;语言有USAGE权限。对象的创建者当然可以撤销这些权限。(为了最大程度的安全,应在创建对象的同一事务中发出REVOKE;这样就不存在其他用户可以使用该对象的窗口期。)

可能的权限有:

SELECT

允许对指定表、视图或序列的任意列进行SELECT。还允许使用 COPY TO。对于序列,此权限还允许使用currval函数。

INSERT

允许向指定表中INSERT新行。还允许 COPY FROM。

UPDATE

允许对指定表的任意列进行UPDATE。除SELECT权限之外,SELECT ... FOR UPDATE还需要此权限。对于序列,此权限允许使用nextval和setval函数。

DELETE

允许从指定表中DELETE行。

RULE

允许在表/视图上创建规则。(见CREATE RULE语句。)

REFERENCES

要创建外键约束,必须在引用表和被引用表上都拥有此权限。

TRIGGER

允许在指定表上创建触发器。(见 CREATE TRIGGER语句。)

CREATE

对于数据库,允许在其中创建新模式。

对于模式,允许在其中创建新对象。要重命名一个现有对象,你必须拥有该对象并且对包含它的模式拥有此权限。

TEMPORARY
TEMP

允许在使用数据库时创建临时表。

EXECUTE

允许使用指定的函数以及使用基于该函数实现的任何操作符。这是唯一适用于函数的权限类型。(此语法也适用于聚集函数。)

USAGE

对于过程语言,允许使用指定的语言来创建以该语言编写的函数。这是唯一适用于过程语言的权限类型。

对于模式,允许访问包含在指定模式中的对象(前提是也满足对象自身的权限要求)。本质上,这允许被授权者在该模式中“查找”对象。

ALL PRIVILEGES

一次性授予适用于该对象的所有权限。在PostgreSQL中PRIVILEGES关键字是可选的,但严格的 SQL 要求它。

其他命令所需的权限列在各自命令的参考页上。

注意

REVOKE命令用于撤销访问权限。

应当注意,数据库超级用户可以访问所有对象,而不受对象权限设置的限制。这与 Unix 系统中root的权利类似。与root一样,除非绝对必要,以超级用户身份操作是不明智的。

目前,在PostgreSQL中要只对少数几个列授予权限,必须创建一个包含所需列的视图,然后把权限授予该视图。

使用psql的\dp命令获取现有权限的信息,例如:

lusitania=> \dp mytable

        Access privileges for database "lusitania"
 Schema |  Table  |           Access privileges
--------+---------+---------------------------------------
 public | mytable | {=r,miriam=arwdRxt,"group todos=arw"}
(1 row)

\dp显示的各项的含义如下:

              =xxxx -- privileges granted to PUBLIC
         uname=xxxx -- privileges granted to a user
   group gname=xxxx -- privileges granted to a group

                  r -- SELECT ("read")
                  w -- UPDATE ("write")
                  a -- INSERT ("append")
                  d -- DELETE
                  R -- RULE
                  x -- REFERENCES
                  t -- TRIGGER
                  X -- EXECUTE
                  U -- USAGE
                  C -- CREATE
                  T -- TEMPORARY
            arwdRxt -- ALL PRIVILEGES (for tables)

上面的示例输出是用户miriam在创建表mytable并执行

GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT,UPDATE,INSERT ON mytable TO GROUP todos;

之后将会看到的。

如果某个对象的“访问权限”列为空,表示该对象拥有默认权限(即其权限字段为 NULL)。默认权限总是包含拥有者的所有权限,并且根据对象类型,可能像上面解释的那样包含授予PUBLIC的某些权限。对对象的第一次GRANT或REVOKE会把默认权限实例化(例如产生{=,miriam=arwdRxt}),然后按指定的请求修改它们。

示例

把表 films 上的插入权限授予所有用户:

GRANT INSERT ON films TO PUBLIC;

把视图kinds上的所有权限授予用户manuel:

GRANT ALL PRIVILEGES ON kinds TO manuel;

兼容性

SQL92

ALL PRIVILEGES中的PRIVILEGES关键字是必需的。SQL不支持在一条命令中为多个表设置权限。

SQL92的 GRANT 语法允许为表中的单个列设置权限,也允许设置把相同权限授予他人的权限:

GRANT privilege [, ...]
    ON object [ ( column [, ...] ) ] [, ...]
    TO { PUBLIC | username [, ...] } [ WITH GRANT OPTION ]

SQL允许为其他类型的对象授予 USAGE 权限:CHARACTER SET、COLLATION、TRANSLATION、DOMAIN。

TRIGGER 权限是在 SQL99 中引入的。RULE 权限是 PostgreSQL 扩展。

另见

REVOKE

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。