我正在尝试撤销数据库用户的权限,但似乎只能由授予权限的用户撤销。这里有讨论这个问题的线程。http://archives.postgresql.org/pgsql-bugs/2007-05/msg00234.php
该线程可以追溯到 2007 年,我不太确定它是否被视为错误,以及该问题是否仍然存在于我正在使用的 PostgreSQL 8.4 中。
是否有可以显示该信息的查询或视图?这样我就可以使用set session authorization
并撤销它。
PostgreSQL 8.4已经过时了。有关详细信息,请查看版本控制策略。但由于它是SQL的标准行为(正如Tom Lane在您提供的链接讨论中所说),因此它不太可能改变。
权限与相应的对象一起存储在系统目录中。例如,对于表:
SELECT n.nspname, c.relname, c.relacl
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.oid = 'myschema.mytbl'::regclass -- your tablename here
会产生类似的东西:
nspname | relname | relacl
----------+---------+---------------------------------------------
myschema | mytbl | {postgres=arwdDxt/postgres,fuser=r/fadmin}
斜杠后面的角色名称是授予者。要以用户fadmin
(或任何超级用户)身份撤销:
REVOKE SELECT ON TABLE myschema.mytbl FROM fuser;
其他系统表中也有类似的*acl
列。 pg_namespace
模式等。请参阅手册中的系统表列表。
更简单的方法是使用 pgAdmin 并在左侧的对象浏览器中选择一个对象。ACL 将显示在右上角的属性窗格中。