Trong Postgres system catalogs là tập hợp cơ bản của thông tin đầy đủ 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. Information schema như một tính năng phụ trợ dựa trên catalog hệ thống và được cung cấp để tương thích với RDBMS khác:
Giản đồ thông tin được định nghĩa trong tiêu chuẩn SQL và do đó có thể được dự kiến sẽ được cầm tay và duy trì ổn định - không giống như hệ thống các danh mục, cụ thể cho PostgreSQL và được mô hình hóa sau các mối quan tâm thực hiện. Tuy nhiên, các khung nhìn lược đồ thông tin không chứa thông tin về các tính năng cụ thể của PostgreSQL; để hỏi về những người bạn cần truy vấn danh mục hệ thống hoặc các chế độ xem cụ thể khác của PostgreSQL.
Chế độ xem vật chất không phải là các đố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 là null
thì chủ sở hữu có tất cả các đặc quyền.
Chuỗi trống dưới dạng 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 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)
Truy vấn của bạn không hoạt động cho chế độ xem thông thường, nhưng không cho lượt xem vật chất. –