我有这样一个触发器:
IF ( value > new.value ) THEN ... END IF
它将被执行 AFTER INSERT . 我需要通过 value (它是一个数字)插入时,因为使用它进入触发器的条件。你知道我怎么通过吗?注意,目前它是硬编码为触发器式的 IF ( 5 > new.value ) THEN . 我想做的就是传递这个 5 插入时动态执行。
AFTER INSERT
value
IF ( 5 > new.value ) THEN
5
yqyhoc1h1#
不,没有定义的机制将参数传递给触发器。我唯一能想到的就是一个用户定义的变量(但我并不想去那里),或者一个 SELECT 语句从表中检索值。我们可以在会话中设置用户定义的变量:
SELECT
SET @value_for_after_insert_trigger = 5 ;
然后执行插入
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 触发器可能执行以下语句:
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 语句从表中查询值。
1条答案
按热度按时间yqyhoc1h1#
不,没有定义的机制将参数传递给触发器。
我唯一能想到的就是一个用户定义的变量(但我并不想去那里),或者一个
SELECT
语句从表中检索值。我们可以在会话中设置用户定义的变量:
然后执行插入
当触发after insert触发器时(对于每行),触发器主体可以引用用户定义的变量。例如:
那我们就可以做了
注意,我们不能保证会话中的其他语句不会修改用户定义的变量。例如,一个
BEFORE INSERT
触发器可能执行以下语句:... 覆盖以前存储的值。这个
AFTER INSERT
触发器将读取当前分配的值,得到42,而不是我们前面指定的5。我们不能保证AFTER INSERT
触发器不会执行某些修改值的操作。影响后续行的触发器执行。
我不主张这是一种设计。我会避免使用这样的用户定义变量。
另一种选择是使用
SELECT
语句从表中查询值。