11

ユーザーが PostgreSQL の特定のクラス (テーブルや関数など) に対して特定の権限 (選択や実行など) を取得したかどうかを確認するための推奨される方法は何ですか?

現時点で私は次のようなものを手に入れました

aclcontains(
    someColumnWithAclitemArray,
    makeaclitem(userOid,grantorOid,someRight,false))

grantorOidしかし、可能性のあるすべてuserOidのものと、ユーザーが所属できるすべてのものをチェックする必要があるため、これはひどいものです。

関連するメモ: テストできる可能性のある権利は何ですか? ドキュメントは見つかりませんでしたが、ソースコードを読んでいると思います:

INSERT
SELECT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT

権利もあるようですが、関数CREATE TEMPで使用する正しいテキストがわかりませんmakeaclitem

4

3 に答える 3

18

より良いアプローチは、has_*_privilege関数を使用し、ユーザーと物体。これは、いくつかのグループ ロールを介してオブジェクトにアクセスできることも考慮に入れます。

たとえば、カタログ以外のテーブルとビューへのアクセス権を持つユーザーが次のように表示されます。

select usename, nspname || '.' || relname as relation,
       case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type,
       priv
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace,
     pg_user,
     (values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder)
where relkind in ('r', 'v')
      and has_table_privilege(pg_user.usesysid, pg_class.oid, priv)
      and not (nspname ~ '^pg_' or nspname = 'information_schema')
order by 2, 1, 3, privorder;

可能な権限については、http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLEhas_*_privilegeの関数の説明で詳しく説明されています。

'CREATE TEMP' はデータベース レベルの権限であり、ユーザーがpg_temp_*スキーマを使用することを許可します。でテストできますhas_database_privilege(useroid, datoid, 'TEMP')

于 2009-06-03T20:59:57.743 に答える
6

「アクセス権照会関数」「GRANT」のリファレンスページを参照してください。

于 2009-06-03T21:00:14.527 に答える