更改表所有权
作为超级用户或表所有者,可以使用
ALTER TABLE...OWNER TO
重新分配表所有权,如下所示:
ALTER TABLE [schema.]table-name OWNER TO owner-name
将表从一个架构移动到另一个架构时,更改表所有权很有用。当表所有者离职或更换工作职责时,所有权重新分配也很有用。由于可以更改表所有者,因此表无需完全重写,进而可以避免生产率下降。
更改表所有权会自动导致以下更改:
-
由原始所有者对表进行的授权将被删除,对该表的所有现有权限都将从前一个所有者那里撤销。表所有权的更改对架构权限没有影响。
-
从属
IDENTITY/AUTO-INCREMENT
序列的所有权随表一起转移。但是,对于使用CREATE SEQUENCE
创建的指定序列,所有权不会更改。要转移这些序列的所有权,请使用ALTER SEQUENCE
。 -
新的表所有权会传播到其投影。
示例
在以下示例中,用户 Bob 连接到数据库,查找表,然后将表 t33
的所有权从自己转移到用户 Alice。
=> \c - Bob
You are now connected as user "Bob".
=> \d
Schema | Name | Kind | Owner | Comment
--------+--------+-------+---------+---------
public | applog | table | dbadmin |
public | t33 | table | Bob |
(2 rows)
=> ALTER TABLE t33 OWNER TO Alice;
ALTER TABLE
当 Bob 再次查找数据库表时,他不再看到表 t33
:
=> \d List of tables
List of tables
Schema | Name | Kind | Owner | Comment
--------+--------+-------+---------+---------
public | applog | table | dbadmin |
(1 row)
当用户 Alice 连接到数据库并查找表时,她将看到她是表 t33
的所有者。
=> \c - Alice
You are now connected as user "Alice".
=> \d
List of tables
Schema | Name | Kind | Owner | Comment
--------+------+-------+-------+---------
public | t33 | table | Alice |
(2 rows)
Alice 或超级用户可以将表所有权转移回 Bob。在以下情况下,超级用户执行转移操作。
=> \c - dbadmin
You are now connected as user "dbadmin".
=> ALTER TABLE t33 OWNER TO Bob;
ALTER TABLE
=> \d
List of tables
Schema | Name | Kind | Owner | Comment
--------+----------+-------+---------+---------
public | applog | table | dbadmin |
public | comments | table | dbadmin |
public | t33 | table | Bob |
s1 | t1 | table | User1 |
(4 rows)
也可以查询系统表
V_CATALOG.TABLES
以查看表和所有者信息。注意,所有权更改不会更改表 ID。
在下面的一系列命令中,超级用户将表所有权更改回 Alice,并查询系统表 TABLES
。
=> ALTER TABLE t33 OWNER TO Alice;
ALTER TABLE
=> SELECT table_schema_id, table_schema, table_id, table_name, owner_id, owner_name FROM tables;
table_schema_id | table_schema | table_id | table_name | owner_id | owner_name
-------------------+--------------+-------------------+------------+-------------------+------------
45035996273704968 | public | 45035996273713634 | applog | 45035996273704962 | dbadmin
45035996273704968 | public | 45035996273724496 | comments | 45035996273704962 | dbadmin
45035996273730528 | s1 | 45035996273730548 | t1 | 45035996273730516 | User1
45035996273704968 | public | 45035996273795846 | t33 | 45035996273724576 | Alice
(5 rows)
现在,超级用户将表所有权更改回 Bob,并再次查询 TABLES
表。除了 owner_name
行从 Alice 更改为 Bob,没有其他改变。
=> ALTER TABLE t33 OWNER TO Bob;
ALTER TABLE
=> SELECT table_schema_id, table_schema, table_id, table_name, owner_id, owner_name FROM tables;
table_schema_id | table_schema | table_id | table_name | owner_id | owner_name
-------------------+--------------+-------------------+------------+-------------------+------------
45035996273704968 | public | 45035996273713634 | applog | 45035996273704962 | dbadmin
45035996273704968 | public | 45035996273724496 | comments | 45035996273704962 | dbadmin
45035996273730528 | s1 | 45035996273730548 | t1 | 45035996273730516 | User1
45035996273704968 | public | 45035996273793876 | foo | 45035996273724576 | Alice
45035996273704968 | public | 45035996273795846 | t33 | 45035996273714428 | Bob
(5 rows)