PLPGSQL中如何捕获EXECUTE语句返回消息并触发通知
PostgreSQL DO块动态执行DDL捕获执行状态解决方案
你可以通过PL/pgSQL的异常捕获和日志打印能力实现需求,不需要修改数据库配置,完全适配Azure Database for Postgres的权限限制,修改后的完整代码如下:
DO $$ DECLARE _table varchar[]; loop_item text; _err_msg text; BEGIN SELECT array_agg(table_name::TEXT) FROM information_schema.tables INTO _table WHERE table_schema = 'public'; FOREACH loop_item IN ARRAY _table LOOP IF loop_item != 'test' THEN -- 单表单独加异常捕获,避免某张表执行失败中断整个批量操作 BEGIN -- 用%I作为标识符占位符,自动转义表名特殊字符,避免SQL注入或语法错误 EXECUTE format('ALTER TABLE %I ADD COLUMN IF NOT EXISTS new_column varchar;', loop_item); -- 执行到这一行说明上一条EXECUTE无报错、执行成功 RAISE NOTICE '✅ 表 % 字段添加执行成功', loop_item; EXCEPTION WHEN OTHERS THEN GET STACKED DIAGNOSTICS _err_msg = MESSAGE_TEXT; RAISE NOTICE '❌ 表 % 执行失败,错误信息:%', loop_item, _err_msg; END; END IF; END LOOP; END; $$ LANGUAGE plpgsql;
说明
- 执行前如果看不到NOTICE日志,可以先执行会话级参数配置
SET client_min_messages = notice;,该配置不需要超级权限,Azure PG普通用户即可生效 - 批量执行后,你的数据库客户端会直接打印每张表的执行状态,不需要访问数据库配置文件
- 原代码中的
"_table"双引号包裹数组变量属于语法错误,代码中已经修正,直接去掉双引号即可
内容的提问来源于stack exchange,提问作者riderinred
相关产品推荐
相关产品推荐

