无法删除被授予连接数据库的角色

2023-12-12

我正在使用 PostgreSQL 10.4,我发现了一个奇怪的行为。

如果我们创建一个角色并将其授予CONNECT数据库:

CREATE ROLE dummy;
GRANT CONNECT ON DATABASE test TO dummy;

那么我们就不能删除这个角色,即使它根本不拥有任何对象,这个命令:

DROP ROLE dummy;

Raises:

ERROR: role "dummy" cannot be dropped because some objects depend on it
SQL state: 2BP01
Detail: privileges for database test

文档有点误导:

2B 类 — 依赖权限描述符仍然存在

2B000 dependent_privilege_descriptors_still_exist

2BP01 dependent_objects_still_exist

It says 依赖对象仍然存在,但似乎没有任何对象依赖于这个特定角色,它在数据库上不拥有任何东西。

无论如何,如果我们撤销CONNECT特权,然后可以删除角色:

REVOKE CONNECT ON DATABASE test FROM dummy;
DROP ROLE dummy;

我刚刚检查了 PostgreSQL 9.5 上也存在这种行为。我觉得有点奇怪,我不明白为什么这个特定的特权会导致删除角色失败。

额外的观察结果

这确实是阻塞的,因为我们无法重新分配这个对象:

REASSIGN OWNED BY dummy TO postgres;

也不丢弃对象:

DROP OWNED BY dummy;

两者都会引发相关错误:

错误:重新分配对象的权限被拒绝
SQL状态:42501

错误:删除对象的权限被拒绝
SQL状态:42501

正如@RaymondNijland 指出的,这一定是因为CONNECT特权被视为角色相关的对象。以下查询:

WITH
R AS (SELECT * FROM pg_roles WHERE rolname = 'dummy')
SELECT
    D.*
FROM
    R, pg_shdepend AS D
WHERE
    refobjid = R.oid;

当以下情况时返回单行CONNECT被授予:

"dbid";"classid";"objid";"objsubid";"refclassid";"refobjid";"deptype"
0;1262;27961;0;1260;27966;"a"

当特权被撤销时,根本没有任何行。这至少解释了为什么我们不能重新分配对象。

关于依赖类型,文档 states:

SHARED_DEPENDENCY_ACL (a)

引用的对象(必须是角色)在 依赖的ACL(访问控制列表,即权限列表) 目的。 (A SHARED_DEPENDENCY_ACL条目不是为所有者创建的 对象,因为所有者将拥有一个SHARED_DEPENDENCY_OWNER入口 反正。)

但我没有足够的洞察力来清楚地理解它。

我的问题是:

  • Postgres 是否总是要求在删除角色之前撤销权限?
  • 如果不是,为什么这个特定特权会这样?

使用时有一些非常不直观的权限要求REASSIGN.

我发现,当超级用户帐户不可用时(如 RDS 或 Cloud SQL 的情况),我必须将目标角色授予我的当前角色,以便从目标角色重新分配或删除拥有的对象。例如,如果我的活跃用户是postsgres,我正在尝试删除user_a:

> DROP OWNED BY user_a
ERROR:  permission denied to drop objects
> GRANT user_a TO postgres;
GRANT ROLE
> DROP OWNED BY user_a;
DROP OWNED

现在,如果user_a恰好是以下组织的成员postgres,特别是如果它碰巧通过其他角色继承了该成员资格,我们称之为schema_admin...

> DROP OWNED BY user_a
ERROR:  permission denied to drop objects
> GRANT user_a TO postgres;
ERROR:  role "user_a" is a member of role "postgres"

-- Alright, let's try to revoke it...
> REVOKE postgres FROM user_a;
REVOKE ROLE
> GRANT user_a TO postgres;
ERROR:  role "user_a" is a member of role "postgres"

-- It's still a member through the inherited grant - trying to revoke again doesn't work:
> REVOKE postgres FROM user_a;
WARNING:  role "user_a" is not a member of role "postgres"
REVOKE ROLE

-- So you have to identify the role it's inheriting from, and revoke that:
> REVOKE schema_admin FROM user_a;
REVOKE ROLE
> GRANT user_a TO postgres;
GRANT ROLE

-- Now just to be safe, I'll reassign owned objects before actually dropping everything:
> REASSIGN OWNED BY user_a TO postgres;
REASSIGN OWNED
> DROP OWNED BY user_a;
DROP OWNED
> DROP ROLE user_a;
DROP ROLE;

Voila!

注意:这里还有另一个被广泛引用且有效的答案:https://sysadmintips.com/services/databases/postgresql-error-permission-denied-to-reassign-objects/只要您能够创建并以新的临时用户身份登录,这效果就很好。但是,在某些情况下,这本身就是一个问题(然后您还需要进行额外的清理工作,以便在完成后删除该临时角色),所以我在这里尝试避免这种情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法删除被授予连接数据库的角色 的相关文章

  • 范围为“provided”的工件的 Maven 依赖关系树行为

    我偶然发现同一项目在两台电脑上的不同行为 在两台机器上我运行命令mvn dependency tree X但收到不同的结果 在我收到的第一台机器上 Apache Maven 3 2 2 45f7c06d68e745d05611f7fd14e
  • SQL Server:为什么 ISO-8601 格式的日期依赖于语言?

    我需要一些帮助来理解 SQL Server 中的日期格式处理 如果您尝试以下操作 它将返回正确的结果 SET LANGUAGE English SELECT CAST 2013 08 15 AS DATETIME 2013 08 15 00
  • 如何拥有引用另一个表的检查约束?

    我在 SQL Server 2008 数据库中有以下表 tblItem 其中有一个ItemID field 好项目 它还有一个 ItemID 字段 并且有一个指向 tblItem 的外键 tblBadItem 它也有一个 ItemID 字段
  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • IIF(...) 不是公认的内置函数

    我正在尝试在 Microsoft SQL Server 2008 R2 中使用它 SET SomeVar SomeOtherVar IIF SomeBool value when true value when false 但我收到一个错误
  • 获取mysql中逗号分隔行中不同值的计数

    一个表 Jobs 有 2 列 JobId 城市 当我们保存工作时 工作位置可能是多个城市 如下所示 JobId City 1 New York 2 New York Ohio Virginia 3 New York Virginia 我如何
  • Oracle:按月分区表

    我的解决方案 德语几个月 PARTITION BY LIST to char GEBURTSDATUM Month PARTITION p1 VALUES JANUAR PARTITION p2 VALUES Februar PARTITI
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We
  • 通过 C# SqlCommand 执行合并语句不起作用

    我正在第一次尝试使用临时表和MERGE语句通过更新 SQL 表SqlCommandC 中的对象 我正在开发的程序旨在首先将大量记录 最多 20k 导出到 Excel 电子表格中 然后 用户可以搜索并替换特定值 并根据需要更新任意多记录中的任
  • 如何查看 Maven pom.xml 文件的传递依赖关系?

    有没有一个 CLI 工具可以用来快速查看 Maven 的传递依赖关系pom xml file 在 CLI 上 使用mvn dependency tree http maven apache org plugins maven depende
  • 处理与不同相关实体的一对多的正确模式

    我有一个 C 项目 我使用实体框架作为 ORM 我有一个User 可以向多家银行付款 每家银行都是一个独立的实体 并且每家银行都由不同的字段描述 问题是 一User可以没有或有很多不同的Banks 我不太确定如何对此进行建模 临时解决方案是
  • Postgres - 即使我的角色/用户已被授予“读取”权限,也无法从表中“选择”

    我在 postgres 上有一个管理员角色 用户和一个开发人员角色 开发人员角色继承了我为将来方便而创建的 readaccess 角色的属性 如果我运行 du 我得到 Role name Attributes Member of devel
  • 如何创建没有循环关系的树形表?

    CREATE TABLE TREE node1 id UUID REFERENCES nodes object id NOT NULL node2 id UUID REFERENCES nodes object id NOT NULL CO
  • ALTER TABLE 语句与 FOREIGN KEY 约束冲突

    为什么要添加外键tblDomare表导致此错误 ALTER TABLE 语句与 FOREIGN KEY 约束 FK tblDomare PersN 5F7E2DAC 冲突 冲突发生在数据库 almu0004 表 dbo tblBana 列
  • 支持 >65k 行的 Excel VBA SQL 驱动程序

    在 Excel 2010 中通过 VBA 查询 Excel 数据时 我遇到一个有趣的问题 我正在使用这些驱动程序连接到 xls 或 xls x m 文件 Sub OpenCon ByRef theConn As Connection ByV
  • 如何在 PostgreSQL 中返回不同时区的当前日期

    我正在开发一个使用东部时间并将数据库设置为太平洋时间的应用程序 这已经引起了一些问题 但我们被告知不可能有其他方式 所以我们只能解决它 不管怎样 我遇到的麻烦之一就是获取今天的约会 由于数据库位于太平洋 如果我使用以下命令询问今天的日期cu
  • 计算2个日期之间每个日期的记录数

    我必须创建一个查询来返回多轴图表的结果 我需要计算为 2 个日期之间的每个日期创建的 ID 数量 我试过这个 DECLARE StartDate datetime2 7 11 1 2020 EndDate datetime2 7 2 22
  • Django 独特的不工作

    我在从查询中过滤掉重复项时遇到问题 我正在使用 Django 1 4 和 Postgres 8 4 13 我在我的模型对象上使用这个查询 它是一个 jquery 自动完成 term request GET get term field re
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI

随机推荐