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

标签 database postgresql

想象一个名为 store_a 的数据库,其中包含一个表 products。还有一个名为 store_a_user 的用户。数据库、表、数据、对象等归store_a_user 所有。

我现在创建一个名为 store_b_user 的新用户和一个名为 store_b 的新数据库,方法是使用此命令 CREATE 创建数据库 store_a 模板带有模板 store_a 所有者 store_b_user 的数据库 store_b。这将创建新数据库 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 ).直接引用文档:

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

我有几个问题:

  1. 什么是共享对象? (我似乎找不到这方面的文档)
  2. 当以 postgres 用户身份在 store_b 上运行连接时,为什么原始 store_a 表在 reassign owned 命令下更改所有权?
  3. 我不希望出现上述行为,但如果这种行为应该发生或无法避免,我是否必须手动将所有权重新分配给 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/

相关文章:

php - PDO 中的 'fetch' 只得到一个结果

database - PL/SQL - NOCOPY 参数以提高性能

database - 除了 XML 之外,是否有可以轻松消化分层数据的数据库?

python - Pyspark:从 pyspark 数据帧中删除 UTF 空字符

sql - PostgreSQL 优化器如何处理跨列关联

java - JTable使用绑定(bind)​​,如何获取选中的Element?

mysql - 如何找出数据库中占用内存最大的表?

sql - 在 Postgresql 中选择最近记录的更好方法

Postgresql 用户定义函数创建日期或修改日期

postgresql中的json where子句