PostgreSQL-权限
当一个对象被创建时,它被分配了一个所有者。所有者通常是执行创建语句的角色。对于大多数类型的对象,初始状态是只有所有者(或超级用户)可以对对象执行任何操作。要允许其他角色使用它,必须授予权限。
有不同种类的权限:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER、CREATE、CONNECT、TEMPORARY、EXECUTE 和 USAGE。适用于特定对象的权限因对象的类型(表、函数等)而异。
修改或销毁对象的权利是对象的所有者所固有的,并且本身不能被授予或撤销。(但是,与所有特权一样,该权限可由拥有角色的成员继承)。
可以使用对象适当类型的 ALTER 命令将对象分配给新所有者,例如
ALTER TABLE table_name OWNER TO new_owner;
超级用户总是可以这样做;只有当他们既是对象的当前所有者(或拥有角色的成员)又是新拥有角色的成员时,普通角色才能做到这一点。
要分配权限,请使用 GRANT 命令。例如,如果 joe 是现有角色,而 accounts 是现有表,则可以通过以下方式授予更新表的权限:
GRANT UPDATE ON accounts TO joe;
用 ALL 代替特定权限会授予与对象类型相关的所有权限。
特殊的“角色”名称 PUBLIC 可用于为系统上的每个角色授予特权。此外,当一个数据库有很多用户时,可以设置“组”角色来帮助管理权限。
要撤销先前授予的权限,请使用 REVOKE 命令:
REVOKE ALL ON accounts FROM PUBLIC;
通常,只有对象的所有者(或超级用户)可以授予或撤销对象的权限。但是,可以授予“带有授予选项”的特权,这使接收者有权将其依次授予其他人。如果授权选项随后被撤销,那么所有从该接收者(直接或通过一系列授权)获得特权的人都将失去该特权。
对象的所有者可以选择撤销他们自己的普通权限,例如使表对自己和其他人都是只读的。但是所有者始终被视为持有所有授予选项,因此他们始终可以重新授予自己的权限。
可用的特权是:
SELECT
允许从表、视图、实体化视图或其他类似表的对象的任何列或特定列中进行 SELECT。还允许使用 COPY TO。在 UPDATE 或 DELETE 中引用现有列值也需要此权限。对于序列,此权限还允许使用 currval 函数。对于大型对象,此权限允许读取对象。
INSERT
允许在表、视图等中插入新行。可以在特定列上授予,在这种情况下,只能在 INSERT 命令中分配这些列(因此其他列将接收默认值)。还允许使用 COPY FROM。
UPDATE
允许对表、视图等的任何列或特定列进行 UPDATE。(实际上,任何重要的 UPDATE 命令也需要 SELECT 权限,因为它必须引用表列来确定要更新哪些行,并且/ 或计算列的新值。) SELECT ... FOR UPDATE 和 SELECT ... FOR SHARE 除了 SELECT 权限外,还需要至少一列的此权限。对于序列,此权限允许使用 nextval 和 setval 函数。对于大型对象,此权限允许写入或截断对象。
DELETE
允许从表、视图等中删除一行。(实际上,任何重要的 DELETE 命令也需要 SELECT 权限,因为它必须引用表列来确定要删除哪些行。)
TRUNCATE
允许对表进行 TRUNCATE。
REFERENCES
允许创建引用表或表的特定列的外键约束。
TRIGGER
允许在表、视图等上创建触发器。
CREATE
对于数据库,允许在数据库中创建新的模式和发布,并允许在数据库中安装受信任的扩展。对于模式,允许在模式中创建新对象。要重命名现有对象,您必须拥有该对象并拥有包含架构的此权限。对于表空间,允许在表空间内创建表、索引和临时文件,并允许创建将表空间作为默认表空间的数据库。请注意,撤销此权限不会改变现有对象的存在或位置。
CONNECT
允许被授权者连接到数据库。此权限在连接启动时检查(除了检查 pg_hba.conf 施加的任何限制)。
TEMPORARY
允许在使用数据库时创建临时表。
EXECUTE
允许调用函数或过程,包括使用在函数之上实现的任何运算符。这是唯一适用于函数和过程的特权类型。
USAGE
对于过程语言,允许使用该语言以该语言创建函数。这是唯一适用于过程语言的特权类型。对于模式,允许访问模式中包含的对象(假设也满足对象自身的权限要求)。本质上,这允许被授权者在模式中“查找”对象。如果没有此权限,仍然可以查看对象名称,例如,通过查询系统目录。此外,在撤销此权限后,现有会话可能具有先前执行此查找的语句,因此这不是防止对象访问的完全安全的方法。
对于序列,允许使用 currval 和 nextval 函数。对于类型和域,允许在创建表、函数和其他模式对象时使用类型或域。(请注意,此权限不控制该类型的所有“使用”,例如查询中出现的该类型的值。它仅阻止创建依赖于该类型的对象。此权限的主要目的是控制哪些用户可以在类型上创建依赖关系,这可能会阻止所有者稍后更改类型。)
对于外部数据包装器,允许使用外部数据包装器创建新服务器。对于外部服务器,允许使用服务器创建外部表。被授权者还可以创建、更改或删除他们自己的与该服务器关联的用户映射。
PostgreSQL 在创建对象时默认将某些类型的对象的权限授予 PUBLIC。默认情况下,PUBLIC 在表、表列、序列、外部数据包装器、外部服务器、大型对象、模式或表空间上不授予任何特权。对于其他类型的对象,授予 PUBLIC 的默认权限如下: 数据库的 CONNECT 和 TEMPORARY(创建临时表)权限;函数和过程的 EXECUTE 特权;语言和数据类型(包括域)的 USAGE 特权。当然,对象所有者可以撤销默认权限和明确授予的权限。(为了获得最大的安全性,请在创建对象的同一事务中发出 REVOKE;然后没有其他用户可以使用该对象的窗口。)此外,可以使用 ALTER DEFAULT PRIVILEGES 命令覆盖这些默认权限设置。
权限,权限缩写及应用的对象:

每种对象可用的权限及psql命令:

已为特定对象授予的权限显示为 aclitem 条目列表,其中每个 aclitem 描述了由特定授予者授予的一个被授予者的权限。例如,calvin=rw/hobbes 指定角色 calvin 具有权限 SELECT (r) 和授予选项 () 以及不可授予的权限 UPDATE (w),两者均由角色 hobbes 授予。如果 calvin 还对由不同授予者授予的同一对象具有某些权限,则这些权限将显示为单独的 aclitem 条目。aclitem 中的空受让人字段代表 PUBLIC。
例如,假设用户 miriam 创建表 mytable 并执行以下操作:
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 命令将显示:


浙公网安备 33010602011771号