为什么PostgreSQL重新分配角色命令,更改模板数据库的所有者

时间:2017-03-22 12:44:58

标签: database postgresql

想象一个名为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_userstore_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

我有几个问题:

  1. 什么是共享对象? (我似乎无法找到相关的文件)
  2. 为什么原始store_a表在使用store_b作为postgres用户的连接运行时,在reassign owned命令下更改所有权?
  3. 我不想要上述行为但是如果这种行为被认为发生或无法避免,我被迫手动将所有权重新分配给store_a?

1 个答案:

答案 0 :(得分:3)

你已经很好地分析了这种情况。

回答1

共享对象是指不属于单个数据库但属于整个数据库群集的对象。示例是pg_authid,其中包含所有数据库共有的用户,以及pg_database,其中包含所有数据库。

共享对象位于特殊的表空间pg_global中,对应于数据目录中的global子目录。

回答2

因为,正如您引用的文档所述,共享对象也会受到影响,而数据库store_a是共享对象。

数据库store_a中的对象不是全局对象且不受影响。

回答3

运行store_a后,您必须更改数据库REASSIGN OWNED的所有权。没有比这更好的方法了。

安慰:在版本8.2之前,当引入REASSIGN OWNED时,事情变得更加困难。