2009-06-03 1 views
11

ユーザが特定の権限を持っているかどうかを判断するにはどうすればよいでしょうかPostgreSQLの特定のクラス(テーブルや関数など)?PostgreSQLのユーザがテーブル/関数/ ...を選択/更新する権限を持っているかどうかを調べる

現時点では私は

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

のようなものを得たが、私は可能であり、すべてのユーザーがuserOidに属することができますごとgrantorOidをチェックする必要があるため、それはひどいです。

関連するメモ:テストできる権利は何ですか? 私は任意の文書が見つかりましたが、私は推測するソースコードを読んでいない:

INSERT 
SELECT 
UPDATE 
DELETE 
TRUNCATE 
REFERENCES 
TRIGGER 
EXECUTE 
USAGE 
CREATE 
CONNECT 

もありCREATE TEMP右のようですが、私はmakeaclitem -functionに使用する正しいテキストを把握することはできません。

答えて

17

私は、これは、has_*_privilege関数を使用して、すべてのセットに単純に適用することで、より良いアプローチ(これはpsqlやinfo_schemaビューに組み込まれたいくつかのクエリから取得されたことを思い出しているようです)ユーザーとオブジェクトの可能な組み合わせ。これは、何らかのグループ役割を介してオブジェクトにアクセスすることも考慮に入れます。

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')でテストできます。

関連する問題