如何从登录角色撤消所有组角色?有没有办法自动完成这个?
答案 0 :(得分:4)
由于您可以同时GRANT
/ REVOKE
多个角色,因此使用动态SQL的单个DO
命令会更简单/更快(基于集合的操作在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
特权,另一些则没有(“组角色”)。 user
和group
之间的区别在于历史。
答案 1 :(得分: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;