web-dev-qa-db-ja.com

postgresのテーブルのクエリ許可

Postgresのオブジェクトに付与されたすべてのGRANTSを照会するにはどうすればよいですか?

たとえば、「mytable」というテーブルがあります。

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

私は私に与えるものが必要です:

user1: SELECT, INSERT
user2: UPDATE
77
markus

私はすでにそれを見つけました:

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

\z mytable psqlからは、テーブルからすべての権限が付与されますが、個々のユーザーごとに分割する必要があります。

91
CPJ

ユーザーごとに1行が本当に必要な場合は、被付与者でグループ化できます(string_aggにはPG9 +が必要です)

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)
26
Nicolas Payart

以下のクエリを試してください。テーブルのすべてのユーザーとその権限のリストが表示されます。

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';
22
shruti

このクエリは、すべてのデータベースとスキーマのすべてのテーブルを一覧表示します(特定のデータベース、スキーマ、またはテーブルをフィルタリングするために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 |
...
7
isapir

@shrutiの答えに追加する

特定のユーザーのスキーマ内のすべてのテーブルの許可を照会するには

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;
2

特定のテーブルの許可クエリを生成するスクリプトを次に示します。所有者の特権は省略されます。

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;
1
Sahap Asci