如何从登录角色中撤销所有组角色?有没有办法自动做到这一点?
问问题
1905 次
2 回答
5
由于您可以同时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()
聚合函数需要 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)
并循环遍历结果以 REVOKE rolname FROM usename;
于 2012-11-28T15:58:57.707 回答