如何在pgAdmin4中禁用删改查询并创建带pg_read_all_data角色的用户?
一、解决禁用DELETE/UPDATE时的"relation 'site' does not exist"错误
你遇到的错误是因为参考方案中用到了名为site的特定表,但你的数据库里没有这个表。以下是通用的禁用所有DELETE和UPDATE操作的方法:
方法1:通过权限控制(推荐)
直接撤销用户的DELETE和UPDATE权限,同时阻止后续新增表自动获得这些权限:
- 撤销已有表的权限:
REVOKE DELETE, UPDATE ON ALL TABLES IN SCHEMA public FROM [你的用户名]; - 设置默认权限(新增表自动继承):
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE DELETE, UPDATE ON TABLES FROM [你的用户名];
方法2:通过触发器全局阻止
创建一个通用触发器函数,然后绑定到所有表上:
- 创建阻止函数:
CREATE OR REPLACE FUNCTION block_delete_update() RETURNS TRIGGER AS $$ BEGIN RAISE EXCEPTION 'DELETE和UPDATE操作已被禁用'; END; $$ LANGUAGE plpgsql;
- 批量给所有表绑定触发器:
DO $$ DECLARE rec RECORD; BEGIN FOR rec IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' LOOP EXECUTE format('CREATE TRIGGER block_%s_del_upd BEFORE DELETE OR UPDATE ON %s FOR EACH STATEMENT EXECUTE FUNCTION block_delete_update();', rec.tablename, rec.tablename); END LOOP; END $$;
二、在pgAdmin4中创建用户并分配pg_read_all_data角色
图形化操作步骤:
- 打开pgAdmin4,连接到目标PostgreSQL服务器。
- 展开服务器节点下的「登录/组角色」,右键选择「创建」>「登录/组角色」。
- 在「常规」标签页:输入用户名,设置登录密码。
- 切换到「权限」标签页:找到「角色成员」区域,点击「添加」按钮。
- 在弹出的选择窗口中,找到
pg_read_all_data角色并选中,点击「选择」。 - 切换到「SQL」标签页可预览生成的语句,确认无误后点击「保存」完成创建。
快捷SQL命令方式:
如果更习惯用SQL,直接执行以下语句:
CREATE USER [新用户名] WITH PASSWORD '[用户密码]'; GRANT pg_read_all_data TO [新用户名];
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

