我在Postgres 9.2.23中有几个表,我需要定期更新权限(每天或每天多次)。我有一个在其他地方维护的主列表,谁可以选择我用来授予权限。但是,我想确保那些曾经在列表中但已经退出的人已经撤销了所有权限。
我的想法是用以下方式进行彻底的扫描:
revoke all privileges on my_table from [all users/roles]
之后我授予授权用户选择权。但是,我还没有弄清楚如何对所有用户/角色进行批量撤销。
我知道我可以生成一个当前拥有权限的用户/角色列表并从那里开始,但我希望有一条捷径可以绕过它。
谢谢。
答案 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
语句。
或者更简单,只需遍历所有角色并撤消除所有者之外的所有人的所有权限。
如果您不直接向用户授予权限,但使用角色,那么您可以安全地完成整个过程。为角色的对象授予权限,并为用户分配角色。
这样管理权限就简单得多。