如何创建默认未启用、需通过SET ROLE激活的PostgreSQL角色
PostgreSQL中NOINHERIT角色未生效的问题排查与解决
你的问题根源在于两个关键疏漏:
- PostgreSQL默认会给
public角色授予新表的SELECT/INSERT/UPDATE/DELETE权限,所有用户默认都属于public,所以你撤销user的插入权限后,它依然能通过public的权限执行插入。 - 你没有给
admin_role授予表t的INSERT权限,即便切换角色也无法实现预期的插入操作。
以下是修正后的完整操作步骤:
-- 创建默认不继承的角色 CREATE ROLE admin_role NOINHERIT; -- 创建登录用户(修正你原SQL中角色名与注释不一致的问题) CREATE ROLE user1 LOGIN PASSWORD 'secret'; GRANT admin_role TO user1; -- 创建表后先撤销public的默认权限 CREATE TABLE t(i integer); REVOKE ALL ON TABLE t FROM public; -- 给admin_role授予插入权限 GRANT INSERT ON TABLE t TO admin_role; -- 确保user1本身无插入权限(可选,因已撤销public权限且未单独授权) REVOKE INSERT ON TABLE t FROM user1;
验证效果:
- 以
user1直接登录执行INSERT INTO t VALUES (1);会触发权限报错 - 执行
SET ROLE admin_role;后,插入操作即可正常执行
内容的提问来源于stack exchange,提问作者tok
相关产品推荐
相关产品推荐

