gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:08:11 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com