gpt4 book ai didi

sql - Firebird - 获取触发器内所有修改的字段

转载 作者:行者123 更新时间:2023-12-02 08:40:20 25 4
gpt4 key购买 nike

我需要获取连续更改的所有值,并在其他“审核”表上发布修改。我可以在不编写行中每个元素的条件的情况下完成此操作吗?我知道来自http://www.firebirdfaq.org/faq133/的SQL这为您提供了所有验证条件:

select 'if (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'
from rdb$relation_fields
where rdb$relation_name = 'EMPLOYEE';

但这应该写在触发器中。因此,如果我更改表,那么我需要修改触发器。

由于 FireBird 不允许动态增加 varchar 变量的大小,我正在考虑将所有值转换并连接到一个大的 varchar 变量,然后再将其插入文本 blob。

是否有可能在不使用 GTTs 的情况下完成此任务? ?

最佳答案

您需要一些元编程,但使用系统表上的触发器就没有问题。

即使您有很多列,此解决方案似乎也有效。

set term ^ ;

create or alter procedure create_audit_update_trigger (tablename char(31)) as
declare sql blob sub_type 1;
declare fn char(31);
declare skip decimal(1);
begin
-- TODO add/remove fields to/from audit table

sql = 'create or alter trigger ' || trim(tablename) || '_audit_upd for ' || trim(tablename) || ' after update as begin if (';

skip = 1;
for select rdb$field_name from rdb$relation_fields where rdb$relation_name = :tablename into :fn do
begin
if (skip = 0) then sql = sql || ' or ';
sql = sql || '(old.' || trim(:fn) || ' is distinct from new.' || trim(:fn) || ')';
skip = 0;
end
sql = sql || ') then insert into ' || trim(tablename) || '_audit (';

skip = 1;
for select rdb$field_name from rdb$relation_fields where rdb$relation_name = :tablename into :fn do
begin
if (skip = 0) then sql = sql || ',';
sql = sql || trim(:fn);
skip = 0;
end
sql = sql || ') values (';

skip = 1;
for select rdb$field_name from rdb$relation_fields where rdb$relation_name = :tablename into :fn do
begin
if (skip = 0) then sql = sql || ',';
sql = sql || 'new.' || trim(:fn);
skip = 0;
end
sql = sql || '); end';

execute statement :sql;
end ^

create or alter trigger field_audit for rdb$relation_fields after insert or update or delete as
begin
-- TODO filter table name, don't include system or audit tables
-- TODO add insert trigger
execute procedure create_audit_update_trigger(new.rdb$relation_name);
end ^

set term ; ^

关于sql - Firebird - 获取触发器内所有修改的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19157376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com