1

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

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

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

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

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

4

1 回答 1

0

有一种方法,但它不受支持且危险,因为它直接更新系统目录。

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

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';

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

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

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

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

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

于 2018-04-19T11:35:04.000 回答