2012-11-28 2 views

답변

4

은/빠른 (설정 기반 작업은 루프보다 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() aggregate function에는 PostgreSQL 9.0 이상이 필요합니다.

quote_ident() 비표준 식별자로 인해 문제가 발생하지 않습니다 (SQL 인젝션 포함).

효과적으로 같은 명령을 실행 :

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

그리고 더 GRANT의가 발견되지 않으면 아무것도하지 않습니다.
Note the tricky name in double quotes, but properly quoted by quote_ident().

은 BTW :이 모든 GRANT의 "그룹의 역할을"취소 여부. PostgreSQL에 대한 모든 역할이며, 일부는 LOGIN 권한이 있고, 다른 것은 권한이 없습니다 ("그룹 역할"). usergroup의 차이점은 history입니다.

+0

감사합니다. Erwin, 답변입니다. –

0

는 usename로부터 rolname을 취소 할 수있는 결과를 통해 모든 역할

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를 조회 할 필요가 있다고 생각; 당신이 한 번에 GRANT/REVOKE 여러 역할, 동적 SQL 단일 DO 명령은 간단 할 것입니다 수 있기 때문에

관련 문제