如何检查列是否正在更新

时间:2018-05-07 17:49:43

标签: sql triggers firebird

假设我有一条指令执行以下操作:

update client set active = 0;

有没有办法在Firebird中做到这一点,就像Oracle一样......

if updating (active) ...

只有在只更新“有效”列时才会执行触发器。

我试过这种方式,但它不起作用:

CREATE OR ALTER TRIGGER CLIENT_SYNC FOR CLIENT
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
as begin   
    IF UPDATE(ACTIVE)   
        new.ACTIVE = NULL;
end;

1 个答案:

答案 0 :(得分:3)

Firebird没有像updating那样的东西。您需要将之前的值(在old上下文变量中)与新值(在new上下文变量中)进行比较,最好使用is distinct from来避免null出现问题:

set term #;
CREATE OR ALTER TRIGGER CLIENT_SYNC FOR CLIENT
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
as 
begin   
    IF (old.active is distinct from new.active) then  
        new.ACTIVE = NULL;
end#
set term ;#

通过设置new.ACTIVE = null的更新在上下文中似乎有点奇怪,但我认为这只是一个占位符(否则ACTIVEnull之外的其他任何内容都不能。)< / p>

请务必咨询Firebird documentation on procedural SQL,因为您问题中的代码还有其他一些语法错误。