PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL में भौतिक दृश्य के लिए अनुदान और विशेषाधिकारों की सूची बनाएं

Postgres में सिस्टम कैटलॉग स्थापना और डेटाबेस के बारे में पूरी जानकारी का मूल सेट हैं। सिस्टम कैटलॉग जानकारी का सबसे विश्वसनीय स्रोत हैं।सूचना स्कीमा एक सहायक सुविधा के रूप में सिस्टम कैटलॉग पर आधारित है और अन्य आरडीबीएम के साथ संगतता के लिए प्रदान की जाती है:

भौतिक दृश्य 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. वसंत में पोस्टग्रेज पूर्णांक सरणी के लिए क्वेरी कैसे करें

  2. शब्द को शांत करने का सबसे आसान तरीका पोस्टग्रेएसक्यूएल में अनुक्रमित नोटिस होने के लिए बहुत लंबा है

  3. डेटाबेस निर्माण पर पोस्टग्रेज एक्सटेंशन कैसे स्थापित करें?

  4. क्या कोई इस एसक्यूएल को समझा सकता है? (और मैं इसे 'पैरामीट्रिज' कैसे कर सकता हूं और एक समारोह के रूप में आह्वान कर सकता हूं?)

  5. पोस्टग्रेज:एक-से-अनेक खोज के लिए फ़्लोट सरणियों की कोसाइन समानता पर अनुक्रमणिका