Triggers 我只想用新值或旧值记录表中的所有列,但触发器无法编译

Triggers 我只想用新值或旧值记录表中的所有列,但触发器无法编译,triggers,firebird,Triggers,Firebird,我想在firebird db上创建一个触发器: SET TERM ^ ; create trigger log_trigger_error for test before insert or update as begin INSERT INTO test_log (a,b) select case when (new.rdb$field_name is null and old.rdb$field_name is not null o

我想在firebird db上创建一个触发器:

SET TERM ^ ;
create trigger log_trigger_error for test
  before insert or update
as
begin
  INSERT INTO test_log (a,b)
    select case when (new.rdb$field_name is null and old.rdb$field_name  is not null 
                    or new.rdb$field_name is not null and old.rdb$field_name is null 
                    or new.rdb$field_name <> old.rdb$field_name) 
                then  new.rdb$field_name   
                else old.rdb$field_name as a
        end , 2 as b 
    from rdb$relation_fields
    where rdb$relation_name ='TEST';

end^

SET TERM ; ^
SET TERM^;
为测试创建触发器日志\u触发器\u错误
在插入或更新之前
作为
开始
插入测试日志(a、b)
当(new.rdb$field_name为null,old.rdb$field_name不为null)时选择case
或者new.rdb$field\u name不为null,而old.rdb$field\u name为null
或new.rdb$field_name old.rdb$field_name)
然后是新的.rdb$field\u名称
else old.rdb$字段名称作为
完,2为b
来自rdb$relationship\u字段
其中rdb$relation_name='TEST';
结束^
设定期限^

您正在为表
测试创建触发器,但是在触发器主体中,您在从表
rdb$relation\u字段中选择的
上下文变量上使用了
。这是不可能的,
new
old
变量仅适用于触发器所在的表

如果要记录对数据的更改,请使用触发器

create trigger log_trigger_error for test before update
as
begin
  INSERT INTO test_log (a, b) VALUES(old.a, old.b);
end^

现在,当更新
test
表中的记录时,旧值被记录到
test\u log
表中。

您正在为表
test
创建一个触发器,但是在触发器体中,您在select from表
rdb$relation\u字段上使用
new
old
上下文变量。这是不可能的,
new
old
变量仅适用于触发器所在的表

如果要记录对数据的更改,请使用触发器

create trigger log_trigger_error for test before update
as
begin
  INSERT INTO test_log (a, b) VALUES(old.a, old.b);
end^

现在,当更新
test
表中的记录时,旧值被记录到
test\u log
表中。

感觉问题中的代码是从记录字段重命名的代码复制和修改的。可能
值(case when old.a不同于new.a然后是old.a else null end,case when old.b不同于new.b然后是old.b else null end)
和if-to-only insert(仅当其中一个或两个字段不同时插入)可能会实现OP似乎想要做的事情。感觉问题中的代码是从记录字段重命名的代码复制和修改的。可能
值(case when old.a不同于new.a然后是old.a else null end,case when old.b不同于new.b然后是old.b else null end)
和if-to-only insert(仅当其中一个或两个不同时插入)可能实现OP似乎想要做的事情。您能描述一下此触发器应该做什么吗?您能描述一下此触发器应该做什么吗?