2011-09-07 11 views
52

Jak mogę zapytać o wszystkie GRANTY przyznane obiektowi w postgresie?Przyznanie zapytań dla tabeli w postgresie

Na przykład mam tabeli "mojatabela":

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

muszę somthing które daje mi:

user1: SELECT, INSERT 
user2: UPDATE 

Odpowiedz

59

ja już znalazłem:

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

\z mytable z psql daje wszelkie dotacje z tabeli, ale że następnie podzielić go przez pojedynczego użytkownika.

+0

chcesz uruchomić to bezpośrednio z okienka sQL lub wiersza poleceń pg? –

+1

@ DanielL.VanDenBosch: wszystkie meta-komendy, takie jak '\ z', są dla psql. A psql to interfejs wiersza poleceń do PostgreSQL. –

18

Jeśli naprawdę chcesz jeden wiersz dla każdego użytkownika, można grupa przez beneficjenta (wymaga PG9 + dla string_agg)

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

ten powinien wypisać coś takiego:

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

Prawie czego chcę, czy mogę mieć dokładnie takie wyjścia GRANT'a jak pg_dump? – brauliobo

8

Wypróbuj poniższe zapytanie. Otrzymasz listę wszystkich użytkowników i ich uprawnień na stole.

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

To jest tutaj jedyna odpowiedź, która oblicza uprawnienia uzyskane z członkostwa w innych rolach, więc dostaje mój głos. Z drugiej strony, powiedziałbym 'has_table_privilege (usename, contact (schemaname, '.', Tablename), ...)' aby uniknąć dwuznaczności. –

+0

Plus jeden - TO JEST CZYSTE ZŁOTO! – Daniel

0

Oto skrypt, który generuje zapytania o przyznanie dla konkretnej tabeli. Pomija uprawnienia właściciela.

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

To zapytanie będzie lista wszystkich tabel we wszystkich baz danych i schematów (Odkomentuj linii (i) w klauzuli WHERE filtrowania dla określonych baz danych, schematów lub tabel), z uprawnieniami pokazano na kolejność tak, że jest to łatwe, aby zobaczyć, czy dany przywilej udzielenia lub nie: wyjście

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; 

Próbka:

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 | 
... 
Powiązane problemy