有一种方法,但它不受支持且危险,因为它直接更新系统目录。
作为超级用户,您可以执行以下操作:
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
语句。
或者更简单,只需遍历所有角色并撤销除所有者之外的所有人的所有权限。
如果您不直接向用户授予权限,而是使用角色,那么您可以保护自己的整个混乱局面。将对象权限授予角色,并将角色分配给用户。
这样管理权限就简单多了。