我有一个这样的触发器:
IF ( value > new.value ) THEN
...
END IF
将执行AFTER INSERT
。我需要在插入时传递value
(它是一个数字)因为它在触发器的条件中使用它。知道我怎么能通过它?
注意到,目前它被硬编码到像IF ( 5 > new.value ) THEN
这样的触发器中。我试图做的就是在插入时动态传递5
。
答案 0 :(得分:1)
不,没有将参数传递给TRIGGER的定义机制。
我唯一能想到的是用户定义的变量(但我真的不想去那里),或者用SELECT
语句从表中检索值。
我们可以在会话中设置用户定义的变量:
SET @value_for_after_insert_trigger = 5 ;
然后执行INSERT
INSERT INTO mytable (...) VALUES (...)
当触发AFTER INSERT触发器时(对于每一行),触发器主体可以引用用户定义的变量。例如:
DECLARE ln_value INTEGER;
SET ln_value = @value_for_after_insert_trigger;
然后我们可以做
IF ( ln_value > NEW.value ) THEN
请注意,我们无法保证会话中的其他语句不会修改我们的用户定义变量。例如,BEFORE INSERT
触发器可能会执行以下语句:
SET @value_for_after_insert_trigger = 42 ;
...覆盖以前存储的值。 AFTER INSERT
触发器将读取当前分配的值,获取42,而不是我们之前指定的5。并且我们无法保证AFTER INSERT
触发器不会执行某些修改该值的操作。
SET @value_for_after_insert_trigger = @value_for_after_insert_trigger + 1;
影响后续行的触发器执行。
我不提倡将其作为设计。我会避免使用像这样的用户定义变量。
另一种方法是使用SELECT
语句从表中查询值。