Postgresql撤销所有权限所有用户和角色

时间:2018-04-18 16:39:53

标签: postgresql privileges revoke

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

我的想法是用以下方式进行彻底的扫描:

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

之后我授予授​​权用户选择权。但是,我还没有弄清楚如何对所有用户/角色进行批量撤销。

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

谢谢。

1 个答案:

答案 0 :(得分: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语句。

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

如果您不直接向用户授予权限,但使用角色,那么您可以安全地完成整个过程。为角色的对象授予权限,并为用户分配角色。

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