2016-12-26 109 views
0

我有一个这样的触发器:为什么触发器的一部分在其余部分之前被执行?

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之前执行,我不知道为什么。你有一个想法如何解决它?

在此先感谢

+0

你确定触发器没有被执行两次吗? – Bohemian

回答

1

有没有办法在触发后编码代码前面的代码之前执行。

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

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

你需要弄清楚为什么它被调用两次。


可能的修复,如果不能防止它被调用了两次,可能是允许长度为3:

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

注意,从空白测试是通过测试的覆盖长度小于11.

+0

我在声明后添加了一个简单的'INSERT'来查看触发器是否工作,是的它被执行两次。 – Triti

+0

@triti然后代码行为正确。请参阅编辑答案以了解可能的修复方法 – Bohemian

+0

我忘了说,在所有这些行动后,这是一个更新查询 – Triti

相关问题