如何从登录角色撤消所有组角色

Ale*_*ich 0 postgresql

如何从登录角色撤消所有组角色?有没有一种方法可以自动执行此操作?

Erw*_*ter 5

由于您可以一次GRANT/同时REVOKE扮演多个角色,因此DO使用动态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
$$
Run Code Online (Sandbox Code Playgroud)

DO命令以及string_agg()聚合函数需要PostgreSQL 9.0或更高版本。

quote_ident() 确保非标准标识符不会引起麻烦(包括SQL注入)。

有效执行以下命令:

REVOKE role_a, role_b, "FROM postgres; DELETE * FROM usr; --" FROM my_user;
Run Code Online (Sandbox Code Playgroud)

如果找不到GRANT,则不执行任何操作。
请注意棘手的名称用双引号引起来,但应使用正确的引号quote_ident()

顺便说一句:这将撤消所有 GRANT的“组角色”,或不撤消。它只是PostgreSQL的角色,有些具有LOGIN特权,有些则没有(“组角色”)。user和之间的区别group是历史。