sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLのマテリアライズドビューの権限と権限を一覧表示します

    Postgresではシステムカタログ インストールとデータベースに関する完全な情報の基本セットです。システムカタログは最も信頼できる情報源です。情報スキーマ> 補助機能はシステムカタログに基づいており、他のRDBMとの互換性のために提供されています:

    マテリアライズド・ビューはSQL標準オブジェクトではないため、情報スキーマにはそれらに関する情報は含まれていません。

    システムカタログpg_class relacl列の特権に関するすべての情報が含まれています 。

    列がnullの場合 その後、所有者はすべての特権を持ちます。

    aclのユーザー名としての空の文字列 文字列はpublicを意味します 。

    create materialized view test_view as select 1;
    grant select on test_view to public;
    grant delete on test_view to a_user;
    
    select 
        coalesce(nullif(s[1], ''), 'public') as grantee, 
        s[2] as privileges
    from 
        pg_class c
        join pg_namespace n on n.oid = relnamespace
        join pg_roles r on r.oid = relowner,
        unnest(coalesce(relacl::text[], format('{%s=arwdDxt/%s}', rolname, rolname)::text[])) acl, 
        regexp_split_to_array(acl, '=|/') s
    where nspname = 'public' and relname = 'test_view';
    
     grantee  | privileges 
    ----------+------------
     postgres | arwdDxt
     public   | r
     a_user   | d
    (3 rows)
    

    読み取り可能で権限を表示する関数が必要です 形式:

    create or replace function priviliges_from_acl(text)
    returns text language sql as $$
        select string_agg(privilege, ', ')
        from (
            select 
                case ch
                    when 'r' then 'SELECT'
                    when 'w' then 'UPDATE'
                    when 'a' then 'INSERT'
                    when 'd' then 'DELETE'
                    when 'D' then 'TRUNCATE'
                    when 'x' then 'REFERENCES'
                    when 't' then 'TRIGGER'
                end privilege
            from
                regexp_split_to_table($1, '') ch
        ) s 
    $$;
    

    使用:

    select 
        coalesce(nullif(s[1], ''), 'public') as grantee, 
        priviliges_from_acl(s[2]) as privileges
    from 
        pg_class c
        join pg_namespace n on n.oid = relnamespace
        join pg_roles r on r.oid = relowner,
        unnest(coalesce(relacl::text[], format('{%s=arwdDxt/%s}', rolname, rolname)::text[])) acl, 
        regexp_split_to_array(acl, '=|/') s
    where nspname = 'public' and relname = 'test_view';
    
     grantee  |                          privileges                           
    ----------+---------------------------------------------------------------
     postgres | INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER
     public   | SELECT
     a_user   | DELETE
    (3 rows)
    


    1. PostgreSQLの主キーとしてのUUIDは、インデックスのパフォーマンスを低下させますか?

    2. 順序と制限を使用した奇妙な結果

    3. LaravelとAWSCloudfront

    4. mysqlクエリ:行われたすべての支払いの概要と日付ごとの請求書の合計を表示します