Запрос грантов на стол в postgres

Как я могу запросить все GRANTS, предоставленные объекту в postgres?

Например, у меня есть таблица "mytable":

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

Мне нужно что-то, что дает мне:

user1: SELECT, INSERT
user2: UPDATE
72 голоса | спросил markus 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 07 Sep 2011 19:26:09 +0400 2011, 19:26:09

6 ответов


0

Я уже нашел это:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'
ответил markus 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 07 Sep 2011 19:40:41 +0400 2011, 19:40:41
0

\z mytable из psql дает вам все гранты из таблицы, но вам придется разделить их по отдельным пользователям.

ответил CPJ 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 07 Sep 2011 19:32:25 +0400 2011, 19:32:25
0

Если вы действительно хотите одну строку для пользователя, вы можете группировать по получателю (требуется 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)
ответил Nicolas Payart 10 J0000006Europe/Moscow 2014, 19:39:22
0

Попробуйте выполнить запрос ниже. Он выдаст вам список всех пользователей и их разрешения в таблице.

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';
ответил shruti 8 FebruaryEurope/MoscowbWed, 08 Feb 2017 12:13:01 +0300000000pmWed, 08 Feb 2017 12:13:01 +030017 2017, 12:13:01
0

В этом запросе будут перечислены все таблицы во всех базах данных и схемах (раскомментируйте строку (и) в предложении 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 |
...
ответил isapir 13 12017vEurope/Moscow11bEurope/MoscowMon, 13 Nov 2017 00:46:34 +0300 2017, 00:46:34
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;
ответил Sahap Asci 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 15 Sep 2017 11:45:29 +0300 2017, 11:45:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132