假设我有一条指令执行以下操作:
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;
答案 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
的更新在上下文中似乎有点奇怪,但我认为这只是一个占位符(否则ACTIVE
除null
之外的其他任何内容都不能。)< / p>
请务必咨询Firebird documentation on procedural SQL,因为您问题中的代码还有其他一些语法错误。