创建一个动态触发器,比较Firebird中的所有字段

时间:2014-11-20 07:57:14

标签: sql firebird triggers

用于更新名为' last_modified'的字段我尝试使用触发器自动更新此字段,而不是更改所有更新语句。只有在字段值发生更改时才应更新该字段。这里的问题是,如果添加,删除或重命名表字段,则必须维护触发器。这些字段存储在rdb $ relation_fields中,没问题。但是建立一个动态比较旧值和新值的查询是。

create trigger test for test_table active before update position 0 as
declare variable fn char(31);
begin
  for select rdb$field_name from rdb$relation_fields where rdb$relation_name = 'test_table' into :fn       do
  begin
    if ('old.'||:fn <> 'new.'||:fn) then
    begin
      new.last_modified = current_timestamp;
      break;
    end
  end
end

这里的问题是“旧”。&#39; ||:fn和&#39; new。&#39;:fn并不是真正比较值,而是文字字符串,所以字段的值无法比较。我在这里Firebird - get all modified fields inside a trigger看到触发器附加到系统表,这是我不想要的。

这是一种全自动的方式来更新&#39; last_modified&#39;字段不可能这样吗?或者,我必须创建一个删除al触发器的存储过程,然后在对数据库执行更新后使用新字段重新创建它们(使用此代码http://www.firebirdfaq.org/faq133/)。

0 个答案:

没有答案