You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建默认未启用、需通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:07:34