【问题标题】:Postgres REASSIGN OWNED for only 1 databasePostgres REASSIGN OWNED 仅适用于 1 个数据库
【发布时间】:2014-11-18 20:28:02
【问题描述】:

我想使用 REASSIGN OWNED 查询将 1 个数据库中的所有对象从所有者 A 更改为所有者 B。

假设我有以下数据库:

 postgres              | postgres        | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0             | postgres        | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                       |                 |          |             |             | postgres=CTc/postgres
 template1             | postgres        | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                       |                 |          |             |             | postgres=CTc/postgres
 db1                   | user1           | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 db2                   | user1           | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 db3                   | user2           | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

我想要 db1 和里面的所有对象,以便它们归 user2 所有。我跑:

postgres=# \c db1
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
You are now connected to database "db1" as user "postgres".
db1=# REASSIGN OWNED BY user1 TO user2;
REASSIGN OWNED

db1 及其所有对象的所有者发生了应有的变化。但是该命令也改变了 db2 的所有者。不是 db2 中的对象,只是数据库(like 和 ALTER DATABASE 语句):

 postgres              | postgres        | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0             | postgres        | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                       |                 |          |             |             | postgres=CTc/postgres
 template1             | postgres        | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                       |                 |          |             |             | postgres=CTc/postgres
 db1                   | user2           | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 db2                   | user2           | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 db3                   | user2           | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

这是正常行为吗?如何在不更改其他数据库的情况下运行REASSIGN OWNED

【问题讨论】:

  • 这看起来像一个错误。至少documentation 完全没有暗示它。你觉得submitting 是这样的吗?
  • @DanielVérité 感谢您的意见。我刚刚将其报告为错误(#12008)。我会回复 Posgres 人的任何反馈。

标签: database postgresql alter


【解决方案1】:

Daniel Vérité 评论中引用的文档指出:

old_role

The name of a role. The ownership of all the objects within the current database, and of all shared objects (databases, tablespaces), owned by this role will be reassigned to new_role.

所以这是符合规范的。如果这不是您想要的,我认为您需要更全面地说明您的用例。

【讨论】:

  • 但是之前的 9.2 版本,有 this: "REASSIGN OWNED 命令不会影响角色拥有的任何数据库的所有权。使用 ALTER DATABASE 重新分配该所有权",这 与当前行为相反 (9.3)。令人惊讶的是,它是一种不可避免的副作用,而不是一种新的非默认选项。
  • 由于this bug report,这已在this commit 中更改。
猜你喜欢
  • 2013-06-02
  • 1970-01-01
  • 2021-03-18
  • 2017-11-10
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2019-11-16
  • 2017-11-30
相关资源
最近更新 更多