
# 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();
```
