# 5.7.特权

创建对象时,会为其指定所有者。所有者通常是执行创建语句的角色。对于大多数类型的对象,初始状态是只有所有者(或超级用户)可以对对象执行任何操作。要允许其他角色使用它,特权必须承认。

有不同种类的特权:选择,插入,使现代化,删去,截断,推荐人,触发,创造,连接,短暂的,处决用法适用于特定对象的权限因对象的类型(表、函数等)而异。关于这些特权含义的更多细节见下文。以下章节还将向您展示如何使用这些特权。

修改或销毁物品的权利是物品所有者的固有权利,其本身不能被授予或撤销。(但是,与所有特权一样,该权利也可以由所属角色的成员继承;请参阅。)第22.3节.)

可以使用改变例如,为对象指定适当类型的命令

ALTER TABLE table_name OWNER TO new_owner;

超级用户总能做到这一点;普通角色只有同时是对象的当前所有者(或所有者角色的成员)和新所有者角色的成员时才能执行此操作。

要分配特权,请授予命令被使用。例如,如果是现有角色,以及账户如果是现有表,则可以通过以下方式授予更新该表的权限:

GRANT UPDATE ON accounts TO joe;

全部的代替特定权限,授予与对象类型相关的所有权限。

特殊的“角色”名称平民的可用于向系统上的每个角色授予权限。此外,还可以设置“组”角色,以便在数据库有许多用户时帮助管理权限——有关详细信息,请参阅第22章.

要撤销以前授予的特权,请使用合适的名称撤销命令:

REVOKE ALL ON accounts FROM PUBLIC;

通常,只有对象的所有者(或超级用户)可以授予或撤销对象的权限。然而,有可能授予“授予选择权”的特权,这使接受者有权反过来将其授予他人。如果授予选项随后被撤销,则所有从该接收者(直接或通过一系列授予)获得特权的人都将失去该特权。有关详细信息,请参阅授予撤销参考页。

对象的所有者可以选择撤销自己的普通特权,例如,使表为自己和他人只读。但所有者总是被视为持有所有授予选择权,因此他们总是可以重新授予自己的特权。

可用特权包括:

选择

允许选择来自表、视图、物化视图或其他类似表的对象的任何列或特定列。还允许使用抄送。引用中的现有列值时也需要此权限使现代化删去.对于序列,此权限还允许使用库瓦尔作用对于大型对象,此权限允许读取对象。

插入

允许插入可以在特定列上授予将新行添加到表、视图等中的权限,在这种情况下,只能在插入命令(因此其他列将接收默认值)。还允许使用抄袭.

使现代化

允许使现代化表、视图等的任何列或特定列(实际上,任何非平凡的使现代化命令将需要选择权限,因为它必须引用表列来确定要更新哪些行和/或计算列的新值。)选择更新选择分享除了选择特权对于序列,此权限允许使用nextval塞特瓦尔功能。对于大型对象,此权限允许写入或截断对象。

删去

允许删去表、视图等中的一行(实际上,任何非平凡的删去命令将需要选择权限,因为它必须引用表列来确定要删除哪些行。)

截断

允许截断在桌子上。

推荐人

允许创建引用表或表的特定列的外键约束。

触发

允许在表、视图等上创建触发器。

创造

对于数据库,允许在数据库中创建新的架构和发布,并允许在数据库中安装受信任的扩展。

对于模式,允许在模式中创建新对象。要重命名现有对象,必须拥有该对象对包含的架构具有此权限。

对于表空间,允许在表空间中创建表、索引和临时文件,并允许创建将表空间作为默认表空间的数据库。

请注意,取消此权限不会改变现有对象的存在或位置。

连接

允许被授权人连接到数据库。在连接启动时检查此权限(除了检查pg_hba。形态).

短暂的

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

处决

允许调用函数或过程,包括使用在函数顶部实现的任何运算符。这是唯一适用于函数和过程的特权类型。

用法

对于过程语言,允许使用该语言创建该语言中的函数。这是唯一适用于过程语言的特权类型。

对于模式,允许访问模式中包含的对象(假设对象自身的权限要求也得到满足)。本质上,这允许被授权人在模式中“查找”对象。如果没有此权限,仍然可以查看对象名称,例如通过查询系统目录。此外,在撤销此权限后,现有会话可能有以前执行过此查找的语句,因此这不是防止对象访问的完全安全的方法。

对于序列,允许使用库瓦尔nextval功能。

对于类型和域,允许在创建表、函数和其他架构对象时使用类型或域。(请注意,此权限并不控制该类型的所有“使用”,例如查询中出现的该类型的值。它仅阻止创建依赖于该类型的对象。此权限的主要目的是控制哪些用户可以创建对该类型的依赖项,这可能会阻止所有者以后更改该类型。)

对于外部数据包装,允许使用外部数据包装创建新服务器。

对于外部服务器,允许使用服务器创建外部表。被授权人还可以创建、更改或删除自己与该服务器关联的用户映射。

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

PostgreSQL将某些类型的对象的权限授予平民的默认情况下,在创建对象时。不授予任何特权平民的默认情况下,在表、表列、序列、外部数据包装器、外部服务器、大型对象、模式或表空间上。对于其他类型的对象,为平民的详情如下:连接短暂的(创建临时表)数据库的权限;处决职能和程序特权;和用法语言和数据类型(包括域)的权限。当然,对象所有者可以,撤销默认权限和明确授予的权限。(为获得最大安全性,请发布撤销在创建对象的同一事务中;这样就没有其他用户可以使用该对象的窗口。)此外,可以使用更改默认权限命令

表5.1显示中用于这些特权类型的单字母缩写国际计算语言学协会(访问控制列表)值。您将在psql下面列出的命令,或查看系统目录的ACL列时。

表5.1.ACL特权缩写

特权 缩写 适用的对象类型
选择 r(“读”) 大型物体, 序列, 桌子(和类似表格的对象)、表格列
插入 A.(“附加”) 桌子,表列
使现代化 w(“写”) 大型物体, 序列, 桌子,表列
删去 d 桌子
截断 D 桌子
推荐人 十、 桌子,表列
触发 t 桌子
创造 C 数据库, 模式, 表空间
连接 c 数据库
短暂的 T 数据库
处决 十、 作用, 程序
用法 U 领域, 国外数据包装器, 外部服务器, 语言, 模式, 序列, 类型

表5.2使用上面显示的缩写总结每种类型的SQL对象的可用权限。它还显示了psql命令,可用于检查每种对象类型的权限设置。

表5.2.访问权限摘要

对象类型 所有特权 违约平民的特权 psql命令
数据库 反恐委员会 Tc \l
领域 U U \dD+
作用程序 十、 十、 \df+
国外数据包装器 U 没有一个 \露水+
外部服务器 U 没有一个 \德斯+
语言 U U \dL+
大型物体 rw 没有一个
模式 加州大学 没有一个 \dn+
序列 rwU 没有一个 \dp
桌子(和桌状物体) arwdDxt 没有一个 \dp
表列 arwx 没有一个 \dp
表空间 C 没有一个 \分贝+
类型 U U \dT+

为特定对象授予的权限显示为aclitem条目,每个aclitem描述特定授予人授予的一个受让人的权限。例如卡尔文=r*w/霍布斯指定角色加尔文有特权选择 (r)授予期权(*)以及不可授予的特权使现代化 (w),均由角色授予霍布斯如果加尔文也有其他授予人授予的对同一对象的某些特权,这些特权将作为单独的aclitem进入一片空旷的土地aclitem代表平民的.

例如,假设用户米里亚姆创建表格空白表而且:

GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;

然后是psql\dp命令将显示:

=> \dp mytable
                                  Access privileges
 Schema |  Name   | Type  |   Access privileges   |   Column privileges   | Policies