为什么触发器的一部分在其余部分之前执行?

时间:2016-12-26 17:22:30

标签: sql sybase sybase-ase

我有一个这样的触发器:

DECLARE v1 VARCHAR(4);
and so on declaration
...

IF LENGTH(new.ID) < 11 OR new.ID= '' THEN         
        RAISERROR 23004 'Too short!';
ENDIF;

SET v1 = substring(new.ID,1,3);
and more action on v1...

我想说的是set部分是在if之前执行的,我不知道为什么。你知道如何解决它吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

在触发器中编码的早期代码之前,没有办法执行更晚的代码。

您的触发器正在执行两次。

第一次执行将id截断为3个字符 第二次执行由于id太短而爆炸(因为第一次执行)。

你需要弄清楚它被调用两次的原因。

可能的修复,如果你无法阻止它被调用两次,可能是允许长度为3:

IF LENGTH(new.ID) < 11 AND LENGTH(new.ID) != 3 THEN         
    RAISERROR 23004 'Too short!';
ENDIF;

请注意,测试长度小于11的测试将涵盖空白测试。