由于您可以一次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是历史。
| 归档时间: |
|
| 查看次数: |
1540 次 |
| 最近记录: |