Jak mogę sprawdzić wszystkie GRANTS przyznane obiektowi w postgres?
Na przykład mam tabelę „mytable”:
GRANT SELECT, INSERT ON mytable TO user1
GRANT UPDATE ON mytable TO user2
Potrzebuję czegoś, co da mi:
user1: SELECT, INSERT
user2: UPDATE
sql
postgresql
grant
markus
źródło
źródło
\z
, są dla psql. A psql to interfejs wiersza poleceń dla PostgreSQL.Jeśli naprawdę potrzebujesz jednej linii na użytkownika, możesz pogrupować według grantee (wymagaj 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;
Powinno to wyświetlić coś takiego:
grantee | privileges ---------+---------------- user1 | INSERT, SELECT user2 | UPDATE (2 rows)
źródło
GRANT
takie jak pg_dump?Poniższe zapytanie wyświetli listę wszystkich użytkowników i ich uprawnień w tabeli w schemacie.
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';
Więcej informacji na
has_table_privilages
ten temat można znaleźć tutaj .źródło
has_table_privilege(usename, contact(schemaname, '.', tablename), ...)
uniknąć dwuznaczności.To zapytanie wyświetli listę wszystkich tabel we wszystkich bazach danych i schematach (odkomentuj wiersz (wiersze) w
WHERE
klauzuli, aby przefiltrować określone bazy danych, schematy lub tabele), z uprawnieniami wyświetlanymi w kolejności, aby można było łatwo sprawdzić, czy określony przywilej jest przyznany lub nie: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;
Przykładowe dane wyjściowe:
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 | ...
źródło
Dodanie do odpowiedzi @ shruti
Aby zapytać o przydziały dla wszystkich tabel w schemacie dla danego użytkownika
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;
źródło
FROM pg_tables AS a CROSS JOIN pg_user AS b
Zamiast sposobu SQL 92, aby to zrobić z przecinkiemfrom pg_tables a, pg_user b
Oto skrypt, który generuje zapytania o granty dla określonej 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;
źródło