代码之家  ›  专栏  ›  技术社区  ›  finnsson

了解用户是否有权限在PostgreSQL中选择/更新/..a表/函数/..

  •  11
  • finnsson  · 技术社区  · 15 年前

    在PostgreSQL中,如果用户对某个类(如表或函数)有某种权利(如选择或执行),建议采用什么方法来确定?

    现在我有点像

    aclcontains(
        someColumnWithAclitemArray,
        makeaclitem(userOid,grantorOid,someRight,false))
    

    但这太可怕了,因为我必须检查 grantorOid 这是可能的,每一个 userOid 用户可以属于。

    在相关的注释上:您可以测试哪些可能的权限? 除了阅读源代码之外,我没有找到任何文档:

    INSERT
    SELECT
    UPDATE
    DELETE
    TRUNCATE
    REFERENCES
    TRIGGER
    EXECUTE
    USAGE
    CREATE
    CONNECT
    

    似乎还有一个 CREATE TEMP 是的,但我无法找出在 makeaclitem -函数。

    2 回复  |  直到 12 年前
        1
  •  18
  •   araqnid    12 年前

    我发现一个更好的方法(而且我似乎还记得这是从psql中内置的一些查询中获取的,或者可能是信息_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;
    

    可能的权限在 Hasy**特权 功能在 http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

    “create temp”是数据库级特权:它允许用户使用 pg_temp_* 图式。它可以用 has_database_privilege(useroid, datoid, 'TEMP') .

        2
  •  6
  •   Milen A. Radev    15 年前