0

ログイン ロールからすべてのグループ ロールを取り消すには? これを自動的に行う方法はありますか?

4

2 に答える 2

5

一度に複数のロールを実行できるためGRANTREVOKEDO動的 SQL を使用した単一のコマンドはより単純で高速になります (セットベースの操作は通常、ループよりも RDBMS の方が高速です)。

DO
$$
BEGIN
EXECUTE (
    SELECT 'REVOKE ' || string_agg(quote_ident(rolname), ', ')
            || ' FROM ' || u.usename
    FROM   pg_user         u
    JOIN   pg_auth_members m ON (m.member = u.usesysid) 
    JOIN   pg_roles        r ON (r.oid = m.roleid) 
    WHERE  u.usename = 'my_user'
    GROUP  BY u.usename
    );
END
$$

DOコマンドとstring_agg()集計関数には、PostgreSQL 9.0 以降が必要です。

quote_ident()非標準の識別子が問題を引き起こさないようにします (SQL インジェクションを含む)。

次のようなコマンドを効果的に実行します。

REVOKE role_a, role_b, "FROM postgres; DELETE * FROM usr; --" FROM my_user;

GRANT が見つからない場合は何もしません。
二重引用符で囲まれたトリッキーな名前に注意してくださいquote_ident()

ところで:これは、「グループの役割」かどうかに関係なく、すべての GRANT を取り消します。それはすべて PostgreSQL への単なる役割であり、LOGIN特権を持っているものもあれば、持っていないものもあります (「グループ ロール」)。userとの違いgroupは歴史です。

于 2012-11-28T16:12:04.817 に答える
0

すべての役割を照会する必要があると考える

select usename, rolname 
from pg_user 
join pg_auth_members on (pg_user.usesysid=pg_auth_members.member) 
join pg_roles on (pg_roles.oid=pg_auth_members.roleid) 

結果を LOOP して REVOKE rolname FROM usename にします。

于 2012-11-28T15:58:57.707 に答える