पोस्टग्रेज में तालिका के लिए क्वेरी अनुदान


92

मैं पोस्टग्रेज में किसी ऑब्जेक्ट को दी गई सभी GRANTS की क्वेरी कैसे कर सकता हूं?

उदाहरण के लिए मेरे पास "mytable" टेबल है:

GRANT SELECT, INSERT ON mytable TO user1
GRANT UPDATE ON mytable TO user2 

मुझे कुछ चाहिए जो मुझे देता है:

user1: SELECT, INSERT
user2: UPDATE

जवाबों:


108

मैंने पहले ही इसे पा लिया:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'

97

\z mytable psql से आपको एक टेबल से सभी अनुदान मिलते हैं, लेकिन आपको इसे अलग-अलग उपयोगकर्ता द्वारा विभाजित करना होगा।


क्या आप इसे सीधे sql फलक या pg कमांड लाइन से चला सकते हैं?
डैनियल एल। वनडेनबॉश

2
@ DanielL.VanDenBosch: सभी मेटा-कमांड्स, जैसे \z, psql के लिए हैं। और Psql PostgreSQL का कमांड-लाइन इंटरफ़ेस है।
माइक शेरिल 'कैट रिकॉल'

29

यदि आप वास्तव में प्रति उपयोगकर्ता एक लाइन चाहते हैं, तो आप ग्रैडी द्वारा समूह (आवश्यकता PG9 + string_agg के लिए) कर सकते हैं

SELECT grantee, string_agg(privilege_type, ', ') AS privileges
FROM information_schema.role_table_grants 
WHERE table_name='mytable'   
GROUP BY grantee;

यह कुछ इस तरह उत्पादन करना चाहिए:

 grantee |   privileges   
---------+----------------
 user1   | INSERT, SELECT
 user2   | UPDATE
(2 rows)

1
लगभग जो मैं चाहता हूं, क्या मुझे GRANTpg_dump आउटपुट की तरह सटीक एस मिल सकता है?
ब्रालियोबो

26

नीचे दी गई क्वेरी आपको स्कीमा में टेबल पर सभी उपयोगकर्ताओं और उनकी अनुमतियों की एक सूची देगी।

select a.schemaname, a.tablename, b.usename,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'select') as has_select,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'insert') as has_insert,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'update') as has_update,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'delete') as has_delete, 
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'references') as has_references 
from pg_tables a, pg_user b 
where a.schemaname = 'your_schema_name' and a.tablename='your_table_name';

पर अधिक जानकारी यहाँhas_table_privilages पाया जा सकता है


4
यहां केवल यही एक उत्तर है जो अन्य भूमिकाओं में सदस्यता से प्राप्त अनुमतियों की गणना करता है, इसलिए इसे मेरा वोट मिलता है। दूसरी ओर, मैं has_table_privilege(usename, contact(schemaname, '.', tablename), ...)अस्पष्टता से बचने के लिए कहूंगा ।
पॉल ए जंगविर्थ

प्लस वन - यह स्वर्ण है!
डैनियल

9

यह क्वेरी सभी डेटाबेस और स्कीमा के सभी तालिकाओं को सूचीबद्ध करेगा ( WHEREविशिष्ट डेटाबेस, स्कीमा या टेबल के लिए फ़िल्टर करने के लिए क्लॉज़ में लाइन (एस) को अनसुना करें), विशेषाधिकारों के क्रम में दिखाए गए ताकि यह देखना आसान हो सके कि क्या एक विशिष्ट विशेषाधिकार प्रदान किया जाता है या नहीं:

SELECT grantee
      ,table_catalog
      ,table_schema
      ,table_name
      ,string_agg(privilege_type, ', ' ORDER BY privilege_type) AS privileges
FROM information_schema.role_table_grants 
WHERE grantee != 'postgres' 
--  and table_catalog = 'somedatabase' /* uncomment line to filter database */
--  and table_schema  = 'someschema'   /* uncomment line to filter schema  */
--  and table_name    = 'sometable'    /* uncomment line to filter table  */
GROUP BY 1, 2, 3, 4;

नमूना उत्पादन:

grantee |table_catalog   |table_schema  |table_name     |privileges     |
--------|----------------|--------------|---------------|---------------|
PUBLIC  |adventure_works |pg_catalog    |pg_sequence    |SELECT         |
PUBLIC  |adventure_works |pg_catalog    |pg_sequences   |SELECT         |
PUBLIC  |adventure_works |pg_catalog    |pg_settings    |SELECT, UPDATE |
...

यह केवल उन पंक्तियों को देता है जो उपयोगकर्ता को मिलती हैं, जिन्होंने इसे निष्पादित किया है ... सभी अनुदान नहीं
रिकी लेवी

2

@ श्रुति के जवाब में जोड़ना

किसी दिए गए उपयोगकर्ता के लिए स्कीमा में सभी तालिकाओं के लिए अनुदान देना

select a.tablename, 
       b.usename, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'select') as select,
       HAS_TABLE_PRIVILEGE(usename,tablename, 'insert') as insert, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'update') as update, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'delete') as delete, 
       HAS_TABLE_PRIVILEGE(usename,tablename, 'references') as references 
from pg_tables a, 
     pg_user b 
where schemaname='your_schema_name' 
      and b.usename='your_user_name' 
order by tablename;

यह अच्छी तरह से काम करता है, आप उचित अनुमतियों के साथ एक उपयोगकर्ता के रूप में लॉग इन करते हैं। नाइटपिक: मैं सलाह देता हूं कि क्रॉस क्रॉस को स्पष्ट रूप से लिखा जाना चाहिए, जैसे FROM pg_tables AS a CROSS JOIN pg_user AS bकि एसक्यूएल 92 के बजाय इसे कॉमा के साथ करने का तरीकाfrom pg_tables a, pg_user b
दावोस

1

यहां एक स्क्रिप्ट है जो एक विशेष तालिका के लिए अनुदान प्रश्न उत्पन्न करती है। यह मालिक के विशेषाधिकार को छोड़ देता है।

SELECT 
    format (
      'GRANT %s ON TABLE %I.%I TO %I%s;',
      string_agg(tg.privilege_type, ', '),
      tg.table_schema,
      tg.table_name,
      tg.grantee,
      CASE
        WHEN tg.is_grantable = 'YES' 
        THEN ' WITH GRANT OPTION' 
        ELSE '' 
      END
    )
  FROM information_schema.role_table_grants tg
  JOIN pg_tables t ON t.schemaname = tg.table_schema AND t.tablename = tg.table_name
  WHERE
    tg.table_schema = 'myschema' AND
    tg.table_name='mytable' AND
    t.tableowner <> tg.grantee
  GROUP BY tg.table_schema, tg.table_name, tg.grantee, tg.is_grantable;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.