如何授予非超级用户Postgres集群所有数据库(含未来新建库)访问权限
Postgres非超级用户全集群权限配置方案
可以实现该需求,核心需要同时配置现有对象权限与模板库默认权限,即可覆盖集群内所有现有数据库,以及后续新建的数据库,具体操作如下:
- 步骤1:创建目标非超级用户(已创建可跳过)
CREATE USER app_user WITH PASSWORD '你的强密码' NOSUPERUSER;
- 步骤2:授予所有现有数据库的连接权限
执行以下SQL生成批量授权语句,运行生成的所有语句即可完成现有库的连接授权:
SELECT 'GRANT CONNECT ON DATABASE ' || quote_ident(datname) || ' TO app_user;' FROM pg_database WHERE datistemplate = false;
- 步骤3:配置模板库权限,覆盖后续新建的数据库
Postgres新建数据库默认继承template1模板库的所有配置,修改该模板库的权限即可让后续新库自动继承权限:
-- 切换到template1模板库 \c template1 -- 授予schema使用权限 GRANT USAGE ON SCHEMA public TO app_user; -- 授予模板库内现有所有表的权限,按需调整权限项(以下为增删改查全权限,只读场景可仅保留SELECT) GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user; -- 配置模板库内后续新建表的默认权限 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;
- 步骤4:批量配置所有现有数据库的内部表权限
执行以下SQL生成批量授权语句,逐库运行生成的语句即可完成所有现有库的表权限配置:
SELECT 'GRANT USAGE ON SCHEMA public TO app_user; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;' FROM pg_database WHERE datistemplate = false;
若集群内数据库存在
public以外的自定义schema,需要将上述语句中的public替换为对应schema名称,或遍历所有schema执行授权即可。
权限项可按需调整,仅需只读权限时删除INSERT、UPDATE、DELETE即可。
内容的提问来源于stack exchange,提问作者Saul
相关产品推荐
相关产品推荐

