【问题标题】:Cannot drop PostgreSQL role. Error: `cannot be dropped because some objects depend on it`无法删除 PostgreSQL 角色。错误:`无法删除,因为某些对象依赖于它`
【发布时间】:2018-12-17 18:45:23
【问题描述】:

我试图删除 PostgreSQL 用户:

DROP USER ryan;

我收到了这个错误:

Error in query:
ERROR: role "ryan" cannot be dropped because some objects depend on it
DETAIL: privileges for database mydatabase

我从这些线程中寻找解决方案:

仍然有同样的错误。

这发生在我向用户“ryan”授予所有权限后:

GRANT ALL PRIVILEGES ON DATABASE mydatabase ON SCHEMA public TO ryan;

【问题讨论】:

    标签: postgresql roles database-administration


    【解决方案1】:

    DROP USER(或DROP ROLE,同样的事情)在角色仍然拥有任何东西或对其他对象具有任何授予权限时无法继续。

    使用 DROP OWNED (从措辞上不太明显)摆脱所有特权The manual:

    [...] 授予给定角色在当前对象上的任何特权 数据库和共享对象(数据库、表空间)也将被撤销。

    所以删除角色的可靠命令序列是:

    REASSIGN OWNED BY ryan TO postgres;  -- or some other trusted role
    DROP OWNED BY ryan;
    

    同一集群的每个数据库中运行这两个命令,其中角色拥有任何东西或具有任何特权!
    最后:

    DROP USER ryan;
    
    • REASSIGN OWNED 更改角色当前拥有的所有对象的所有权。
    • DROP OWNED 然后只会撤销特权(所有权不受影响)。

    或者,您可以跳过REASSIGN OWNED。然后DROP OWNED 将(也)删除用户拥有的所有对象。 (你确定吗?!)

    相关:

    【讨论】:

    • 即使用户不拥有任何东西,我也会收到此错误。它仅对另一个用户拥有的几个表具有 GRANT 权限。因此,此解决方案将不起作用,因为没有什么可以重新分配。
    • @Cerin:你看到引用的关于DROP OWNED的句子了吗?
    • 谢谢,不过有一个问题——为什么你从REASSIGN开始?
    • @astrowalker:我在上面添加了更多解释。
    • 我收到“[42501] 错误:重新分配对象的权限被拒绝”错误,以为使用管理员帐户执行查询。
    【解决方案2】:

    对我有用的是 1) 连接数据库

    \c mydatabase
    

    2) 重新分配所有权

    REASSIGN OWNED BY ryan TO <newuser>;
    

    或者/并且只是删除对象

    DROP OWNED BY ryan;
    

    3) 执行 REVOKE PRIVILEGES

    REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM ryan;
    REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM ryan;
    REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM ryan;
    

    4) 删除用户

    DROP USER ryan;
    

    PS:您可能不需要同时执行第 2 步和第 3 步,通常只需执行两个步骤中的一个即可。

    【讨论】:

    • 使用REVOKE CONNECT ON DATABASE db_name FROM role_name;REVOKE ALL ON SCHEMA public FROM role_name; 分别撤销连接和使用权限。 Source
    【解决方案3】:

    对我有用的是重新创建 template1 数据库,然后删除一些角色:

    $ psql -U postgres postgres
    postgres=# update pg_database set datistemplate = false where datname='template1';
    UPDATE 1
    postgres=# drop database template1;
    DROP DATABASE
    postgres=# create database template1 template=template0;
    CREATE DATABASE
    postgres=# update pg_database set datistemplate = true where datname='template1';
    UPDATE 1
    postgres=# DROP ROLE test;
    DROP ROLE
    

    【讨论】:

      【解决方案4】:

      在 RDS Postgres 13 上什么对我有用:

      REVOKE ALL PRIVILEGES ON DATABASE &lt;my_db&gt; FROM &lt;my_user&gt;;

      我也有类似的错误,角色是表的所有者,因此无法删除,必须重新分配表所有者:

      ALTER TABLE &lt;my_table&gt; OWNER TO &lt;trusted_role&gt;;

      在 RDS 上执行这样的 REASSIGN 对我不起作用,因为 AWS 不会为您的主用户提供完整的超级用户: REASSIGN OWNED BY &lt;olduser&gt; TO &lt;newuser&gt;;

      【讨论】:

      猜你喜欢
      • 2021-05-27
      • 2021-07-22
      • 2017-04-14
      • 2018-09-01
      • 2016-05-22
      • 2023-03-08
      • 2020-12-27
      • 2018-05-23
      • 2022-07-12
      相关资源
      最近更新 更多