找出用户是否有权在PostgreSQL中选择/更新/ ...表/函数/ ...

fin*_*son 11 postgresql privileges metadata information-schema

建议用什么方法来确定用户是否在PostgreSQL中的某个类(例如表或函数)上获得了某个权限(例如,选择或执行)?

此刻我得到了类似的东西

aclcontains(
    someColumnWithAclitemArray,
    makeaclitem(userOid,grantorOid,someRight,false))
Run Code Online (Sandbox Code Playgroud)

但它很糟糕,因为我必须检查每一个grantorOid可能的并且每个userOid用户都可以属于.

在相关的说明中:您可以测试哪些可能的权限?我没有找到任何文档,但我想读取源代码:

INSERT
SELECT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT
Run Code Online (Sandbox Code Playgroud)

似乎还有一个CREATE TEMP权利,但我无法弄清楚在makeaclitem-function中使用的正确文本.

ara*_*nid 18

我发现一个更好的方法(我似乎记得这是从内置到psql中的一些查询,或者可能是information_schema视图)是使用这些has_*_privilege函数,并简单地将它们应用于一组所有可能的用户组合和宾语.这将考虑通过某个组角色访问对象.

例如,这将显示哪些用户具有对非目录表和视图的访问权限:

select usename, nspname || '.' || relname as relation,
       case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type,
       priv
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace,
     pg_user,
     (values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder)
where relkind in ('r', 'v')
      and has_table_privilege(pg_user.usesysid, pg_class.oid, priv)
      and not (nspname ~ '^pg_' or nspname = 'information_schema')
order by 2, 1, 3, privorder;
Run Code Online (Sandbox Code Playgroud)

可能的权限has_*_privilegehttp://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE的功能说明中详细说明.

'CREATE TEMP'是一个数据库级特权:它允许用户使用pg_temp_*模式.它可以测试has_database_privilege(useroid, datoid, 'TEMP').