更新时间:2025-06-04 GMT+08:00
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();