U0100016:GaussDB不支持trigger支持自治事务
描述
GaussDB 不支持trigger支持自治事务。
数据库类型与版本
- 源库类型与版本:UGO 支持的 Oracle 版本。
- 目标库类型与版本:UGO 支持的 GaussDB 版本。
语法示例
Oracle脚本:
CREATE OR REPLACE TRIGGER log_employee_insert AFTER INSERT ON employees FOR EACH ROW DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO trigger_log(log_id,employee_id, action_type) VALUES (:NEW.id,100, 'INSERT'); COMMIT; END; /
改造建议
1、首先创建带自治事务的procedure(1.提取insert,update,delete操作+commit/rollback;2.几个new/old加几个入参),
若涉及多条件的(insert,update,delete操作+commit/rollback),创建包方法的方式实现(包含多个带自治事务的procedure);
2、创建触发函数,调用带自治事务的procedure(传参new,old值);
3、创建触发器执行触发函数。
GaussDB改写后的脚本:
--1、首先创建带自治事务的procedure create or replace procedure log_employee_insert( v_id NUMBER) as DECLARE PRAGMA AUTONOMOUS_TRANSACTION; begin INSERT INTO trigger_log(log_id,employee_id, action_type) VALUES (v_id,100, 'INSERT'); COMMIT; end; --、2.然后创建触发函数,调用procedure CREATE OR REPLACE FUNCTION dsc_log_employee_insert_employees_xp() RETURN TRIGGER AS BEGIN PERFORM log_employee_insert(new.id); IF ((TG_OP = 'INSERT') OR (TG_OP = 'UPDATE')) THEN RETURN NEW; ELSE RETURN OLD; END IF; END; --3、最后创建触发器 DROP TRIGGER if exists log_employee_insert on employees; CREATE TRIGGER log_employee_insert AFTER INSERT ON employees FOR EACH ROW EXECUTE PROCEDURE dsc_log_employee_insert_employees_xp();