Arkadaşlar 2 tablom var. Birinci tabloda hangi field'larda değişiklik yapıldıysa ikinci tabloya bu field adı ve yeni değeri yazılmalıdır.
Birinci trigger ile bu işlemi yapıyorum ama çok büyük bir trigger ortaya çıkıyor ve yeni field'lar eklendikçe sorun yaşatacak bir yapı oluşuyor.
Kod: Tümünü seç
CREATE OR ALTER TRIGGER VALUES_TABLE_AFTER_UPD FOR VALUES_TABLE
ACTIVE AFTER UPDATE POSITION 0
AS
begin
if (old.field1<>new.field1) then
insert into MODIFIED_VALUES (VALUES_TABLE_ID, MODIFIED_TIME, FIELD_NAME, NEW_VALUE) VALUES (new.ID, current_timestamp, 'field1', new.field1);
if (old.field2<>new.field2) then
insert into MODIFIED_VALUES (VALUES_TABLE_ID, MODIFIED_TIME, FIELD_NAME, NEW_VALUE) VALUES (new.ID, current_timestamp, 'field2', new.field2);
...
.....
...
if (old.field100<>new.field100) then
insert into MODIFIED_VALUES (VALUES_TABLE_ID, MODIFIED_TIME, FIELD_NAME, NEW_VALUE) VALUES (new.ID, current_timestamp, 'field100', new.field100);
end
Kod: Tümünü seç
CREATE OR ALTER TRIGGER VALUES_TABLE_AFTER_UPD FOR VALUES_TABLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable field_name DOMAIN_VC50;
declare variable old_value DOMAIN_DOUBLE;
declare variable new_value DOMAIN_DOUBLE;
begin
for select rdb$field_name from rdb$relation_fields
where RDB$RELATION_NAME='VALUES_TABLE' and RDB$FIELD_SOURCE='DOMAIN_DOUBLE' into field_name
do
begin
--Execute Statement 'select old.' || field_name || ' from rdb$relation_fields' INTO :old_value; --çalışmıyor
--Execute Statement 'select new.' || field_name || ' from rdb$relation_fields' INTO :new_value; --çalışmıyor
Execute Statement 'old.' || field_name INTO :old_value; --çalışmıyor
Execute Statement 'new.' || field_name INTO :new_value; --çalışmıyor
if (old_value<>new_value) then
insert into MODIFIED_VALUES (VALUES_TABLE_ID, MODIFIED_TIME, FIELD_NAME, NEW_VALUE) VALUES (new.ID, current_timestamp, :field_name, :new_value);
end
end