想象一个名为 store_a
的数据库,其中包含一个表 products。还有一个名为 store_a_user
的用户。数据库、表、数据、对象等归store_a_user
所有。
我现在创建一个名为 store_b_user
的新用户和一个名为 store_b
的新数据库,方法是使用此命令 CREATE 创建数据库
。这将创建新数据库 store_a
模板带有模板 store_a 所有者 store_b_user 的数据库 store_bstore_b
作为 store_a
的精确副本。唯一的问题是数据/对象仍然属于 store_a_user
。为了解决这个问题,我必须以 postgres 用户身份连接到 store_b
数据库,以通过运行将所有 store_a_user
的角色重新分配给 store_b_user
此命令 REASSIGN OWNED BY store_a_user TO store_b_user
。
正如 Postgres 文档显示的 reassign owned命令。为了重新分配角色,您必须连接到有问题的数据库,并连接到对这两个用户都有权限的用户(在我们的例子中是 store_a_user
和 store_b_user
).直接引用文档:
Because REASSIGN OWNED does not affect objects within other databases, it is usually necessary to execute this command in each database that contains objects owned by a role that is to be removed.
REASSIGN OWNED BY store_a_user TO store_b_user
运行后,store_b
内的所有内容现在都归 store_b_owner
所有,这正是我想要的。唯一的问题是运行该命令将 store_a
的所有者更改为 store_b_user
,但只有表的所有者而不是 store_a
中的所有数据>.
文档还指出,它将影响旧角色拥有并重新分配给新角色的所有“共享对象”,直接引用文档:
...and of all shared objects (databases, tablespaces), owned by this role will be reassigned to new_role
我有几个问题:
- 什么是共享对象? (我似乎找不到这方面的文档)
- 当以
postgres
用户身份在store_b
上运行连接时,为什么原始store_a
表在 reassign owned 命令下更改所有权? - 我不希望出现上述行为,但如果这种行为应该发生或无法避免,我是否必须手动将所有权重新分配给 store_a?
最佳答案
你分析的很到位。
回答 1
共享对象 不属于单个数据库,而是属于整个数据库集群。示例是 pg_authid
,它包含所有数据库共有的用户,以及 pg_database
,它包含所有数据库。
共享对象位于一个特殊的表空间 pg_global
中,该表空间对应于数据目录中的 global
子目录。
对 2 的回答
因为,正如您引用的文档所说,共享对象也会受到影响,并且数据库 store_a
是一个共享对象。
数据库 store_a
中的对象不是全局对象,因此不受影响。
回答 3
运行 REASSIGN OWNED
后,您必须更改数据库 store_a
的所有权。没有比这更好的方法了。
放心吧:在引入 REASSIGN OWNED
的 8.2 版之前,事情要困难得多。
关于database - 为什么 PostgreSQL 重新分配角色命令,更改模板数据库的所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42952018/