PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Liệt kê các trợ cấp và đặc quyền cho một chế độ xem cụ thể hóa trong PostgreSQL

Trong Postgres danh mục hệ thống là tập hợp thông tin đầy đủ cơ bản về cài đặt và cơ sở dữ liệu. Danh mục hệ thống là nguồn thông tin đáng tin cậy nhất. Lược đồ thông tin như một tính năng bổ trợ dựa trên danh mục hệ thống và được cung cấp để tương thích với các RDBM khác:

Dạng xem vật chất hóa không phải là đối tượng chuẩn SQL do đó lược đồ thông tin không chứa thông tin về chúng.

Danh mục hệ thống pg_class chứa tất cả thông tin về các đặc quyền trong cột relacl .

Nếu cột null thì chủ sở hữu có tất cả các đặc quyền.

Một chuỗi trống làm tên người dùng trong acl chuỗi có nghĩa là 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)

Bạn cần một chức năng để hiển thị các đặc quyền trong có thể đọc được định dạng:

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

Sử dụng:

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. Kiểm tra tự động quá trình nâng cấp cho PostgreSQL

  2. Làm thế nào để khai báo một mảng kiểu hàng trong một hàm PostgreSQL?

  3. giới hạn giá trị của trường với giá trị từ bảng khác trước khi ghi

  4. Làm cách nào để chuyển một bản ghi đến một hàm PL / pgSQL?

  5. Chi phí của các ràng buộc KIỂM TRA trong Postgres 9.x là bao nhiêu?