更新时间: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();

相关文档