PostgreSQL运维—对象权限
创建对象时,会为其分配一个所有者。所有者通常是执行创建语句的角色。对于大多数类型的对象,初始状态是只有所有者(或超级用户)可以对该对象执行任何操作。要允许其他角色使用它,必须授予相关权限。
有不同种类的特权:SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, CREATE, CONNECT, TEMPORARY, EXECUTE, USAGE,SET和ALTER SYSTEM。适用于特定对象的权限因对象的类型(表、函数等)而异。下面将详细介绍这些权限的含义。
修改或销毁对象的权利是对象所有者所固有的,不能被授予或撤销。(但是,与所有特权一样,该权利可以由拥有角色的成员继承;
例如,可以使用对象的适当类型的 ALTER 命令将对象分配给新所有者
ALTER TABLE table_name OWNER TO new_owner;
超级用户可以直接这样分配;普通角色只有在既是对象的当前owner所有者或拥有角色的成员才能这样分配。
要分配权限,可以使用GRANT命令。例如,可以通过以下方式授予更新表的权限:
GRANT UPDATE ON emp TO lxs;
使用 ALL 代替特定权限会授予与对象类型相关的所有权限。
特殊的“角色”名称PUBLIC可用于为系统上的每个角色授予特权。此外,当数据库有许多用户时,可以设置“group”角色来帮助管理权限。
要回收先前授予的权限,使用REVOKE命令:
REVOKE ALL ON emp FROM PUBLIC;
通常,只有对象的所有者(或超级用户)可以授予或撤销对对象的权限。但是,可以授予“ with grant option ”特权,这使接收者有权将其授予其他人。如果授予选项随后被撤销,那么所有从该接收者(直接或通过授予链)获得特权的人都将失去该权限。。
一个对象的所有者可以选择撤销他们自己的普通权限,例如让一个表对他们自己和其他人只读。但是所有者始终被视为拥有该表的所有权限,因此他们始终可以重新授予自己的新的权限。
可用的特权是:
-
SELECT允许从表、视图、物化视图或其他类似表的对象的任何列或特定列中进行
SELECT。 还允许使用COPY TO。 在UPDATE或DELETE中引用现有列值也需要此权限。 对于序列,此权限还允许使用 currval 函数。 对于大型对象,此权限允许读取对象。 -
INSERT允许将新行插入到表、视图等中。可以在特定列上授予权限,在这种情况下,只有那些列可以在
INSERT命令中分配给它们(因此其他列将接收默认值)。还允许使用COPY FROM。 -
UPDATE允许更新表、视图等的任何列或特定列(实际上,任何重要的 UPDATE 命令也需要 SELECT 权限。因为它必须引用表列来确定要更新的行。)除了 SELECT 特权外,SELECT … FOR UPDATE 和 SELECT … FOR SHARE 还需要对至少一列具有此特权。 对于序列,此权限允许使用 nextval 和 setval 函数。 对于大型对象,此权限允许写入或truncat对象。
-
DELETE允许从表、视图等中删除行(实际上,任何重要的
DELETE命令也需要SELECT权限,因为它必须引用表列来确定要删除的行。) -
TRUNCATE允许对表进行
TRUNCATE。 -
REFERENCES允许创建引用表或表的特定列的外键约束。
-
TRIGGER允许在表、视图等上创建触发器。
-
CREATE对于数据库,允许在数据库中创建新的模式和发布,并允许在数据库中安装受信任的扩展。
对于模式,允许在模式中创建新对象。要重命名现有对象,您必须拥有该对象并对包含的架构具有此权限。
对于表空间,允许在表空间内创建表、索引和临时文件,并允许创建将表空间作为其默认表空间的数据库。
请注意,撤销此权限不会改变现有对象的存在或位置。
-
CONNECT允许被授权者连接到数据库。这个特权在连接启动时被检查(除了检查
pg_hba.conf强加的任何限制)。 -
TEMPORARY允许在使用数据库时创建临时表。
-
EXECUTE允许调用函数或过程,包括使用在函数之上实现的任何运算符。这是适用于函数和过程的唯一特权类型。
-
USAGE对于过程语言,允许使用该语言来创建该语言的函数。 这是适用于过程语言的唯一特权类型。
对于模式,允许访问模式中包含的对象(假设也满足对象自身的特权要求)。 本质上,这允许受让人在模式中“查找”对象。 没有此权限,仍然可以查看对象名称,例如,通过查询系统目录。 此外,在回收此权限后,现有会话可能具有先前执行过此查找的语句,因此这不是防止对象访问的完全安全的方法。
对于序列,允许使用
currval和nextval函数。对于类型和域,允许在创建表、函数和其他模式对象时使用类型或域。 (请注意,此权限不控制类型的所有“使用”,例如出现在查询中的类型的值。它仅防止创建依赖于类型的对象。此权限的主要目的是控制哪些用户可以创建对类型的依赖性,这可以防止所有者以后更改类型。)
对于外部数据包装器,允许使用外部数据包装器创建新服务器。
对于外部服务器,允许使用服务器创建外部表。 还可以创建、更改或删除他们自己的与该服务器关联的用户映射。
-
SET允许在当前会话中将服务器配置参数设置为新值。(虽然可以在任何参数上授予此权限,但除了通常需要超级用户权限才能设置的参数外,它没有任何意义。)
-
ALTER SYSTEM允许使用
ALTER SYSTEM命令将服务器配置参数配置为新值。
其他命令所需的权限列在相应命令的参考页上。
PostgreSQL 在创建对象时默认将某些类型对象的权限授予 PUBLIC。 默认情况下,没有授予 PUBLIC 对表、表列、序列、外部数据包装器、外部服务器、大对象、模式、表空间或配置参数的特权。 对于其他类型的对象,默认赋予PUBLIC的权限如下:数据库的CONNECT和TEMPORARY(创建临时表)权限; 功能和程序的执行特权; 语言和数据类型(包括域)的 USAGE 特权。 当然,对象所有者可以 REVOKE 默认权限和明确授予的权限。 (为了获得最大的安全性,在创建对象的同一事务中发出 REVOKE;这样就没有其他用户可以在其中使用该对象的窗口。)此外,可以使用 ALTER DEFAULT PRIVILEGES 命令覆盖这些默认权限设置。
下表显示了在ACL(访问控制列表)值中用于这些权限类型的单字母缩写。您将在下面列出的psql命令的输出中或在查看系统目录的 ACL 列时看到这些字母。
ACL 权限缩写
| Privilege | Abbreviation | Applicable Object Types |
|---|---|---|
SELECT |
r (“read”) |
LARGE OBJECT, SEQUENCE, TABLE (and table-like objects), table column |
INSERT |
a (“append”) |
TABLE, table column |
UPDATE |
w (“write”) |
LARGE OBJECT, SEQUENCE, TABLE, table column |
DELETE |
d |
TABLE |
TRUNCATE |
D |
TABLE |
REFERENCES |
x |
TABLE, table column |
TRIGGER |
t |
TABLE |
CREATE |
C |
DATABASE, SCHEMA, TABLESPACE |
CONNECT |
c |
DATABASE |
TEMPORARY |
T |
DATABASE |
EXECUTE |
X |
FUNCTION, PROCEDURE |
USAGE |
U |
DOMAIN, FOREIGN DATA WRAPPER, FOREIGN SERVER, LANGUAGE, SCHEMA, SEQUENCE, TYPE |
SET |
s |
PARAMETER |
ALTER SYSTEM |
A |
PARAMETER |
下表使用上面显示的缩写总结了每种类型的 SQL 对象可用的权限。它还显示了可用于检查每种对象类型的权限设置的psql命令。
访问权限摘要
| Object Type | All Privileges | Default PUBLIC Privileges |
psql Command |
|---|---|---|---|
DATABASE |
CTc |
Tc |
\l |
DOMAIN |
U |
U |
\dD+ |
FUNCTION or PROCEDURE |
X |
X |
\df+ |
FOREIGN DATA WRAPPER |
U |
none | \dew+ |
FOREIGN SERVER |
U |
none | \des+ |
LANGUAGE |
U |
U |
\dL+ |
LARGE OBJECT |
rw |
none | \dl+ |
PARAMETER |
sA |
none | \dconfig+ |
SCHEMA |
UC |
none | \dn+ |
SEQUENCE |
rwU |
none | \dp |
TABLE (and table-like objects) |
arwdDxt |
none | \dp |
| Table column | arwx |
none | \dp |
TABLESPACE |
C |
none | \db+ |
TYPE |
U |
U |
\dT+ |
为特定对象授予的权限显示为aclitem条目列表,其中每个条目aclitem描述一个被授予者已被特定授予者授予的权限。例如,calvin=r*w/hobbes指定角色calvin具有权限SELECT( r) 和授予选项 ( *) 以及不可授予的权限UPDATE( w),两者均由角色授予hobbes。如果calvin还拥有不同授予者授予的同一对象的某些特权,则这些特权将显示为单独的aclitem条目。一个空的 grantee 字段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命令将显示:
=> \dp mytable
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+---------+-------+-----------------------+-----------------------+----------
public | mytable | table | miriam=arwdDxt/miriam+| col1: +|
| | | =r/miriam +| miriam_rw=rw/miriam |
| | | admin=arw/miriam | |
(1 row)
如果给定对象的“访问权限”列为空,则表示该对象具有默认权限(即,其在相关系统目录中的权限条目为空)。默认权限始终包括所有者的所有权限,并且可以包括一些权限,PUBLIC具体取决于对象类型,如上所述。第一个GRANT或REVOKE在一个对象上将实例化默认权限(例如,生产miriam=arwdDxt/miriam),然后根据指定的请求修改它们。同样,只有具有非默认权限的列才会在“列权限”中显示条目。(注意:为此目的,“默认权限”always 表示对象类型的内置默认权限。权限受ALTER DEFAULT PRIVILEGES命令影响的对象将始终显示为包含 . 影响的显式权限条目ALTER。)
请注意,所有者的隐式授权选项未在访问权限显示中标记。仅当*授予选项已明确授予某人时才会出现。




