Permissions 红移-获取用户的授权的完整列表

Permissions 红移-获取用户的授权的完整列表,permissions,amazon-redshift,grant,Permissions,Amazon Redshift,Grant,正如您可能已经注意到的,从中提取权限是一件痛苦的事情。处理数组会引发各种错误 因为我用一个自动化程序管理红移的安全性,并且它依赖于组和用户授权,所以我需要知道用户是如何获得特权的:通过组或自定义用户授权 使用所有在线资源,我创建了一个显示上述所有内容的视图。我知道这不是一个问题,但这是我发现的分享代码和“回馈”社区的唯一方式 有人有什么要补充和改进的地方吗 SELECT nspname schema_name , relname table_name

正如您可能已经注意到的,从中提取权限是一件痛苦的事情。处理数组会引发各种错误

因为我用一个自动化程序管理红移的安全性,并且它依赖于组和用户授权,所以我需要知道用户是如何获得特权的:通过组或自定义用户授权

使用所有在线资源,我创建了一个显示上述所有内容的视图。我知道这不是一个问题,但这是我发现的分享代码和“回馈”社区的唯一方式

有人有什么要补充和改进的地方吗

  SELECT nspname schema_name    
        , relname table_name
        , pg_group.groname user_group
        , pg_user.usename  username

        , case when charindex('U',split_part(split_part(array_to_string(nspacl, '|'),usename,2 ) ,'/',1)) > 0 then 'user'
                when charindex('U',split_part(split_part(array_to_string(nspacl, '|'),groname,2 ) ,'/',1)) > 0 then 'group'
          end                                                                                                                   as schema_usage

        , case when charindex('C',split_part(split_part(array_to_string(nspacl, '|'),usename,2 ) ,'/',1)) > 0 then 'user'
                when charindex('C',split_part(split_part(array_to_string(nspacl, '|'),groname,2 ) ,'/',1)) > 0 then 'group'
          end                                                                                                                   as schema_obj_create

         , case 
            when charindex('r',split_part(split_part(array_to_string(relacl, '|'),usename,2 ) ,'/',1)) > 0 then 'user'
            when charindex('r',split_part(split_part(array_to_string(relacl, '|'),groname,2 ) ,'/',1)) > 0 then 'group'
           end                                                                                                                  as table_select

         , case 
            when charindex('w',split_part(split_part(array_to_string(relacl, '|'),usename,2 ) ,'/',1)) > 0 then 'user'
            when charindex('W',split_part(split_part(array_to_string(relacl, '|'),groname,2 ) ,'/',1)) > 0 then 'group'
           end                                                                                                                  as table_update 
         , case 
            when charindex('a',split_part(split_part(array_to_string(relacl, '|'),usename,2 ) ,'/',1)) > 0 then 'user'
            when charindex('a',split_part(split_part(array_to_string(relacl, '|'),groname,2 ) ,'/',1)) > 0 then 'group'
           end                                                                                                                   as table_insert 
         , case 
            when charindex('d',split_part(split_part(array_to_string(relacl, '|'),usename,2 ) ,'/',1)) > 0 then 'user'
            when charindex('d',split_part(split_part(array_to_string(relacl, '|'),groname,2 ) ,'/',1)) > 0 then 'group'
           end                                                                                                                   as table_delete 
         , case 
            when charindex('x',split_part(split_part(array_to_string(relacl, '|'),usename,2 ) ,'/',1)) > 0 then 'user'
            when charindex('x',split_part(split_part(array_to_string(relacl, '|'),groname,2 ) ,'/',1)) > 0 then 'group'
           end                                                                                                                   as table_reference

FROM pg_user 
left join pg_group
    on array_to_string(grolist, '|') like '%'||pg_user.usesysid||'%'
inner join pg_namespace
    on array_to_string(nspacl, '|') like '%'||usename||'%'
        or array_to_string(nspacl, '|') like '%group '||groname||'%'
left join pg_class AS objs
        on relnamespace = pg_namespace.oid
            and (array_to_string(relacl, '|') like '%'||usename||'%'
                    or array_to_string(relacl, '|') like '%group '||groname||'%')