想象一个名为store_a
的数据库,其中包含一个表产品。还有一个名为store_a_user
的用户。数据库,表,数据,对象等归store_a_user
所有。
我现在通过使用此命令store_b_user
模板化数据库store_b
,创建一个名为store_a
的新用户和一个名为CREATE DATABASE store_b WITH TEMPLATE store_a OWNER store_b_user
的新数据库。这会将新数据库store_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
)建立联系。直接引用文档:
由于REASSIGN OWNED不会影响其他数据库中的对象,因此通常需要在每个包含要删除的角色所拥有的对象的数据库中执行此命令。
运行REASSIGN OWNED BY store_a_user TO store_b_user
后,store_b
内的所有内容现在都归store_b_owner
所有,这正是我想要的。唯一的问题是运行该命令会将store_a
的所有者更改为store_b_user
,但只有表的所有者才会将store_a
内的所有数据都更改。
文档还声明它会影响所有"共享对象"由旧角色拥有并重新分配到文档中的新的直接引用:
...以及此角色所拥有的所有共享对象(数据库,表空间)将被重新分配给new_role
我有几个问题:
store_a
表在使用store_b
作为postgres
用户的连接运行时,在reassign owned命令下更改所有权?答案 0 :(得分:3)
你已经很好地分析了这种情况。
回答1
共享对象是指不属于单个数据库但属于整个数据库群集的对象。示例是pg_authid
,其中包含所有数据库共有的用户,以及pg_database
,其中包含所有数据库。
共享对象位于特殊的表空间pg_global
中,对应于数据目录中的global
子目录。
回答2
因为,正如您引用的文档所述,共享对象也会受到影响,而数据库store_a
是共享对象。
数据库store_a
中的对象不是全局对象且不受影响。
回答3
运行store_a
后,您必须更改数据库REASSIGN OWNED
的所有权。没有比这更好的方法了。
安慰:在版本8.2之前,当引入REASSIGN OWNED
时,事情变得更加困难。