PostgreSQL脚本执行时如何忽略特定错误?
PostgreSQL 忽略特定错误码使脚本持续执行
PostgreSQL 提供的 CREATE TABLE IF NOT EXISTS、DROP TABLE IF EXISTS 这类语法能处理对象存在/不存在的场景,但对于像授权给不存在角色这类操作,可通过以下方法实现忽略特定错误、让脚本继续执行的需求:
1. 用 PL/pgSQL 捕获指定错误码
利用 PL/pgSQL 的异常捕获机制,针对目标错误码(比如角色不存在对应的 42704)处理,忽略错误并输出提示。
示例:捕获角色不存在错误,跳过授权操作
DO $$ BEGIN -- 执行目标操作 GRANT SELECT ON g TO noone; EXCEPTION -- 通过错误码精准匹配 WHEN SQLSTATE '42704' THEN RAISE NOTICE '角色 noone 不存在,跳过本次授权'; END $$;
也可以用预定义的异常名称(undefined_object 对应 42704):
DO $$ BEGIN GRANT SELECT ON g TO noone; EXCEPTION WHEN undefined_object THEN RAISE NOTICE '忽略错误:目标对象不存在'; END $$;
2. 预检查对象存在性
在执行操作前主动检查目标对象(比如角色)是否存在,仅当存在时才执行操作:
DO $$ BEGIN -- 检查角色 noone 是否存在 IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'noone') THEN GRANT SELECT ON g TO noone; ELSE RAISE NOTICE '角色 noone 不存在,无需执行授权'; END IF; END $$;
3. 全局关闭错误停止(不推荐)
如果是在 psql 命令行执行脚本,可以通过设置参数关闭错误时停止执行,但这种方法会忽略所有错误,风险较高:
-- 脚本开头添加,关闭错误停止 \set ON_ERROR_STOP 0
内容的提问来源于stack exchange,提问作者Slimboy Fat
相关产品推荐
相关产品推荐

