PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Daftar hibah dan hak istimewa untuk tampilan terwujud di PostgreSQL

Di Postgres katalog sistem adalah kumpulan dasar informasi lengkap tentang instalasi dan database. Katalog sistem adalah sumber informasi yang paling dapat diandalkan.Skema informasi sebagai fitur tambahan didasarkan pada katalog sistem dan disediakan untuk kompatibilitas dengan RDBM lain:

Tampilan terwujud bukan objek standar SQL sehingga skema informasi tidak berisi informasi tentangnya.

Katalog sistem pg_class berisi semua informasi tentang hak istimewa di kolom relacl .

Jika kolomnya null maka pemiliknya memiliki semua hak istimewa.

String kosong sebagai nama pengguna di acl string berarti 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)

Anda memerlukan fungsi untuk menampilkan hak istimewa dalam dapat dibaca format:

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 
$$;

Gunakan:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa yang Harus Diperiksa jika Pemanfaatan Memori PostgreSQL Tinggi

  2. Pengujian Otomatis Cadangan PostgreSQL

  3. Meratakan relasi dengan array untuk memancarkan satu baris per entri array

  4. VACUUM PostgreSQL dan ANALISIS Tips Praktik Terbaik

  5. Bagaimana cara menambahkan jumlah jam variabel ke tanggal di PostgreSQL?