所有权和隐式权限

所有用户都对他们拥有的对象拥有隐式权限。在创建对象时,它的所有者会自动被授予与对象类型相关的所有权限(请参阅数据库对象权限)。无论对象类型如何,以下权限都与所有权密不可分并且不能被撤销,即使是所有者也不能撤销:

  • 将所有对象权限授予其他用户并撤销它们

  • ALTER(如适用)和 DROP

  • 扩展以下权限:将对象权限授予其他用户和撤销该权限

对象所有者可以撤销他们自己的所有非隐式或普通权限。例如,在创建表时,它的所有者会自动被授予所有隐式和普通权限:

如果用户 Joan 创建表 t1,她可以撤销自己的普通权限 UPDATE 和 INSERT,这实际上会将该表设为只读:


=> \c - Joan
You are now connected as user "Joan".
=> CREATE TABLE t1 (a int);
CREATE TABLE
=> INSERT INTO t1 VALUES (1);
 OUTPUT
--------
      1
(1 row)

=> COMMIT;
COMMIT
=> REVOKE UPDATE, INSERT ON TABLE t1 FROM Joan;
REVOKE PRIVILEGE
=> INSERT INTO t1 VALUES (3);
ERROR 4367:  Permission denied for relation t1
=> SELECT * FROM t1;
 a
---
 1
(1 row)

Joan 随后可以还原自己的 UPDATE 和 INSERT 权限:


=> GRANT UPDATE, INSERT on TABLE t1 TO Joan;
GRANT PRIVILEGE
dbadmin=> INSERT INTO t1 VALUES (3);
 OUTPUT
--------
      1
(1 row)

=> COMMIT;
COMMIT
dbadmin=> SELECT * FROM t1;
 a
---
 1
 3
(2 rows)