DB2 在触发器内的表中记录异常

问题描述 投票:0回答:1

我想在发生触发违规时进行一些详细的输出。在下面的触发器中,应该记录

obj
的一些列。 那么最好的方法是什么?插入
LOG_TABLE
不起作用,因为事务会在出现异常时回滚。

CREATE OR REPLACE TRIGGER XYZ 
    NO CASCADE BEFORE UPDATE OF NAME ON MY_TABLE
    REFERENCING NEW AS OBJ
    FOR EACH ROW MODE DB2SQL 
    BEGIN
    DECLARE ERROR_TEXT VARCHAR(1000);
    IF
    OBJ.NAME = ‘Z’
    THEN
    --Insert into MY_SCHEMA.LOG_TABLE(....);
    SET ERROR_TEXT = 'Name not allowed';
    SIGNAL SQLSTATE '7010101' SET MESSAGE_TEXT = ERROR_TEXT;
    END IF;
    END
db2 db2-luw
1个回答
0
投票

您可以为此使用自主程序。

自治过程是一种在被调用时在独立于原始事务的新事务中执行的过程。当自治过程成功完成时,它将提交在该过程中执行的工作,但如果不成功,该过程将回滚它执行的任何工作。无论自主过程的结果如何,调用自主过程的事务不受影响。要将过程指定为自治过程,请在 CREATE PROCEDURE 语句上指定 AUTONOMOUS 关键字。

像这样创建它:

CREATE OR REPLACE PROCEDURE MY_LOGGING_ROUTINE(...)
AUTONOMOUS 
BEGIN
    INSERT INTO MY_SCHEMA.LOG_TABLE(...) VALUES (...);
END@    

并在触发器中使用它:

CREATE OR REPLACE TRIGGER XYZ 
    NO CASCADE BEFORE UPDATE OF NAME ON MY_TABLE
    REFERENCING NEW AS OBJ
    FOR EACH ROW MODE DB2SQL 
    BEGIN
    DECLARE ERROR_TEXT VARCHAR(1000);
    IF
    OBJ.NAME = 'Z'
    THEN

    --Insert into MY_SCHEMA.LOG_TABLE(....);
    CALL MY_LOGGING_ROUTINE(...);

    SET ERROR_TEXT = 'Name not allowed';
    SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = ERROR_TEXT;
    END IF;
    END
© www.soinside.com 2019 - 2024. All rights reserved.