是否可以在不调用回滚的情况下进行SIGNAL?在db2上?

时间:2015-12-08 19:08:42

标签: sql db2

是否可以在不调用回滚的情况下进行SIGNAL(即,是否存在不会导致回滚的SQLSTATE),或SIGNAL是否自动推断回滚?

我有一个查询

CREATE TRIGGER DEAD_TRAILERS_NOTIFY
AFTER UPDATE OF TRAILER ON TRIP 
REFERENCING NEW AS N OLD AS O 
FOR EACH ROW
BEGIN ATOMIC

DECLARE DEAD_SAT VARCHAR(10); 
DECLARE MSG VARCHAR(70); 

SET DEAD_SAT = COALESCE((SELECT TRAILER_ID FROM TRAILER WHERE LAST_SAT_DATE < CURRENT TIMESTAMP - 8 DAYS AND N.TRAILER = TRAILER_ID),'OK');



    IF DEAD_SAT <> 'OK' AND USER NOT IN ('VISTAR','TM4WIN') THEN
    SET MSG = 'SAT ON TRAILER IS DEAD. PLEASE GET IT REPLACED'; 
    SIGNAL SQLSTATE '90001' SET MESSAGE_TEXT = MSG;
    END IF;
END

唯一的问题是,如果它无法满足触发器,它会回滚数据。是否存在不执行此操作或执行所有操作的SQL状态?

3 个答案:

答案 0 :(得分:0)

您需要使用表示警告而不是异常的SQLSTATE。

前两个字符必须为01。

对于用户定义的警告,请使用
01Hxx Valid warning SQLSTATEs returned by a user-defined function or external procedure CALL.

xx是你想要的任何东西。

答案 1 :(得分:0)

您需要将autocommit属性设置为false以便应用程序与数据库的连接,并在应用程序中实现正确的错误处理。当您发现错误时,您可以决定是commit(如果SQLSTATE ='90001')还是rollback(其他错误)。

但是,请记住,如果编写的应用程序不会发出明确的commit语句,则可能会创建其他并发或日志记录问题。

答案 2 :(得分:0)

SIGNAL语句本身不会导致回滚;它是处理信号的客户端(调用者)。例如,如果您从Java程序执行UPDATE,它将获得SQLException,并且由程序员来观察SQLSTATE值并采取相应的行动。