Гранты запроса для таблицы в postgres
Как я могу запросить все гранты, предоставленные объекту в postgres?
например у меня есть таблица "mytable":
GRANT SELECT, INSERT ON mytable TO user1
GRANT UPDATE ON mytable TO user2
мне нужно что-то, что дает мне:
user1: SELECT, INSERT
user2: UPDATE
6 ответов:
\z mytable
от psql дает вам все гранты из таблицы, но затем вам придется разделить его по отдельным пользователям.
Я уже нашел:
SELECT grantee, privilege_type FROM information_schema.role_table_grants WHERE table_name='mytable'
Если вы действительно хотите одну строку на пользователя, вы можете сгруппировать по получателю гранта (требуется 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)
попробуйте выполнить запрос ниже. Это даст вам список всех пользователей и их права на стол.
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';
в этом запросе будут перечислены все таблицы во всех базах данных и схемах (раскомментируйте строки в
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 | ...
вот скрипт, который генерирует запросы на грант для конкретной таблицы. Он опускает привилегии владельца.
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;