2011-09-07 20 views

cevap

59

hemen buldum: Gerçekten kullanıcı başına bir satır istiyorsanız

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

\z mytable sana bir tablodan tüm hibe verir, ama şimdi etsen Örneğin

Ben tablosu "Tablom" var daha sonra bireysel kullanıcı tarafından ayrılmalıdır.

+0

Eğer sql bölmesinde veya pg komut satırından doğrudan bu aday olacağını belirli bir ayrıcalık verilmesi halinde görmek kolay olmadığını böylece sipariş? –

+1

@ DanielL.VanDenBosch: '\ z' gibi tüm meta komutları psql içindir. Ve psql, PostgreSQL'in komut satırı arabirimidir. –

18

, sen hibe alan tarafından grup

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

(string_agg için PG9 + gerektirir) olabilir Bunun günümüze çıktı gibi bir şey:

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

Neredeyse istediğim, 'GRANT'nın pg_dump çıktıları gibi bir tamına sahip olabilir miyim? – brauliobo

8

Aşağıdaki sorguyu deneyin. Bu, tüm kullanıcıların listesini ve onların izinlerini masaüstünde verecektir.

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

Bu, üyelerin diğer rollerdeki izinleri hesaplayan tek cevabı bu yüzden oylarımı alır. Öte yandan, belirsizlikten kaçınmak için has_table_privilege (usename, iletişim (schemaname, '.', Tablename), ...) 'diyorum. –

+0

Plus Bir - BU GÜZEL ALTIN! – Daniel

0

İşte belirli bir tablo için hibe sorguları üreten bir komut dosyası. Bu, sahibinin ayrıcalıklarını ihmal eder.

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

ayrıcalıkları gösterilen ile bu sorgu, (spesifik veri tabanları, şemalar veya tabloların filtrelemek için WHERE maddesi olarak hat (lar) ni) veri tabanları ve şemaların tüm tüm tabloları listeler

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; 

Örnek çıktı:

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 | 
...