2011-09-07 17 views
52

मैं पोस्टग्रेस में किसी ऑब्जेक्ट को दिए गए सभी अनुदानों से कैसे पूछ सकता हूं?पोस्टग्रेज़ में एक तालिका के लिए क्वेरी अनुदान

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

मैं somthing की जरूरत है जो मुझे देता है::

user1: SELECT, INSERT 
user2: UPDATE 

उत्तर

59

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

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

\z mytable psql से आप एक मेज से सभी अनुदान देता है, लेकिन आप चाहते

उदाहरण के लिए मैं टेबल "mytable" है तो इसे अलग-अलग उपयोगकर्ता द्वारा विभाजित करना होगा।

+0

आप एसक्यूएल फलक या स्नातकोत्तर कमांड लाइन से सीधे इस चलाने होगा? –

+1

@ डैनियलएल। वैनडेन बॉश: सभी मेटा-कमांड, जैसे \ \ z', psql के लिए हैं। और psql PostgreSQL के लिए कमांड लाइन इंटरफ़ेस है। –

18

तुम सच में प्रति उपयोगकर्ता एक लाइन चाहते हैं, आप अनुदान प्राप्तकर्ता द्वारा समूह (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

लगभग जो भी मैं चाहता हूं, क्या मेरे पास सटीक 'GRANT की तरह pg_dump आउटपुट हो सकता है? – brauliobo

8

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

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 a.tablename='your_table_name'; 
+1

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

+0

प्लस वन - यह शुद्ध गोल्ड है! – Daniel

0

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

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

इस क्वेरी (विशिष्ट डेटाबेस, स्कीमा, या तालिकाओं के लिए फिल्टर करने के लिए लाइन (रों) 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 | 
... 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^