postgresql - view schema privileges

后端 未结 9 1987
再見小時候
再見小時候 2020-12-24 12:17

Is there a query I can run to show currently assigned privileges on a particular schema?

i.e. privileges that were assigned like so:

GRANT USAGE ON S         


        
9条回答
  •  独厮守ぢ
    2020-12-24 13:02

    Combined version (groups, users, PUBLIC) that works for AWS Redshift:

        SELECT *
    FROM (SELECT CASE
                   WHEN charindex ('U',SPLIT_PART(SPLIT_PART(ARRAY_TO_STRING(nspacl,'|'),pu.usename,2),'/',1)) > 0 THEN ' USAGE'
                   ELSE ''
                 END ||case WHEN charindex('C',SPLIT_PART(SPLIT_PART(ARRAY_TO_STRING(nspacl,'|'),pu.usename,2),'/',1)) > 0 THEN ' CREATE' ELSE '' END AS rights,
                 nspname AS schema,
                 '' AS role,
                 pu.usename AS user
          FROM pg_namespace pn,
               pg_user pu
          WHERE ARRAY_TO_STRING(nspacl,',') LIKE '%' ||pu.usename|| '%'
          --and pu.usename='' 
          AND   nspowner > 1
    
      UNION
    
          SELECT CASE
                   WHEN charindex ('U',SPLIT_PART(SPLIT_PART(ARRAY_TO_STRING(nspacl,'|'),pg.groname,2),'/',1)) > 0 THEN ' USAGE '
                   ELSE ''
                 END ||case WHEN charindex('C',SPLIT_PART(SPLIT_PART(ARRAY_TO_STRING(nspacl,'|'),pg.groname,2),'/',1)) > 0 THEN ' CREATE' ELSE '' END as rights,
                 nspname AS schema,
                 pg.groname AS role,
                 '' AS user
          FROM pg_namespace pn,
               pg_group pg
          WHERE ARRAY_TO_STRING(nspacl,',') LIKE '%' ||pg.groname|| '%'
          --and pg.groname='' 
          AND   nspowner > 1
    
      UNION
    
          SELECT CASE
                   WHEN POSITION('U' IN SPLIT_PART(SPLIT_PART((',' ||array_to_string (nspacl,',')),',' ||roles.name|| '=',2),'/',1)) > 0 THEN ' USAGE'
                   ELSE ''
                 END 
          || CASE
                   WHEN POSITION('C' IN SPLIT_PART(SPLIT_PART((',' ||array_to_string (nspacl,',')),',' ||roles.name|| '=',2),'/',1)) > 0 THEN ' CREATE'
                   ELSE ''
                 END AS rights,
                 nspname AS schema,
                 COALESCE(NULLIF(roles.name,''),'PUBLIC') AS role,
                 '' AS user
          FROM pg_namespace pn,
               (SELECT pg_group.groname AS name
                FROM pg_group
                UNION ALL
                SELECT '' AS name) AS roles
          WHERE (',' ||array_to_string (nspacl,',')) LIKE '%,' ||roles.name|| '=%'
          AND   nspowner > 1) privs
    
    ORDER BY schema,rights
    

提交回复
热议问题