【问题标题】:PostgreSQL Revoke All Permissions from All Users and RolesPostgreSQL 撤销所有用户和角色的所有权限
【发布时间】:2018-09-29 00:01:51
【问题描述】:

我在 Postgres 9.2.23 中有几个表,我需要定期更新权限(每天或每天多次)。我在其他地方维护了一个主列表,谁可以选择我用来授予权限的人。但是,我想确保曾经在名单上但已经退出的任何人都被撤销了所有特权。

我的想法是用类似的东西做一个大扫除:

revoke all privileges on my_table from [all users/roles]

在我将选择授予授权用户之前。但是,我无法弄清楚如何像这样对所有用户/角色进行批量撤销。

我知道我可以生成当前具有特权的用户/角色列表并从那里开始,但我希望有一个捷径可以绕过它。

【问题讨论】:

    标签: postgresql privileges sql-revoke


    【解决方案1】:

    有办法,但不支持,危险,因为它直接更新系统目录。

    作为超级用户,您可以执行以下操作:

    UPDATE pg_catalog.pg_class
    SET relacl = NULL
    WHERE oid = 'my_table'::regclass;
    

    这会重置对象的权限。

    问题在于,这会在 pg_shdepend 中留下一些孤立条目,其中存储了(以及其他)用户和表之间的依赖关系,因此您无法删除仍然对对象具有权限的用户。

    如果我没记错的话,你可以按如下方式删除它们:

    DELETE FROM pg_catalog.pg_shdepend sd
    USING pg_catalog.pg_database d, pg_catalog.pg_authid a
    WHERE sd.dbid = d.oid
      AND sd.refobjid = a.oid
      AND d.datname = current_database()
      AND sd.classid = 'pg_class'::regclass
      AND sd.refclassid = 'pg_authid'::regclass
      AND sd.objid = 'my_table'::regclass
      AND deptype = 'a';
    

    如果这对你来说太危险了,那就对了。

    最好编写一个读取pg_class.relacl 的PL/pgSQL 过程,使用aclexplode 获取条目,循环它们并发出单独的REVOKE 语句。

    或者更简单,只需遍历所有角色并撤销除所有者之外的所有人的所有权限。

    如果您不直接向用户授予权限,而是使用角色,那么您可以保护自己的整个混乱局面。将对象权限授予角色,并将角色分配给用户。

    这样管理权限就简单多了。

    【讨论】:

    • 感谢 Laurenz 的详细回复。就代码行而言,这最终与简单地查询谁拥有特权并撤销它们一样长或更长。由于与我们系统的整体设置有关的原因,我无法使用角色来执行此操作。
    猜你喜欢
    • 2013-09-29
    • 2011-07-14
    • 2021-05-08
    • 2015-07-30
    • 2020-02-16
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多