![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Организация журнал [IB6.x]
Andrey © (2003-01-23 12:33:00)Собственно мыслей на эту тему почти нет.
Нужно записывать в отдельную таблицу (группу таблиц?) все изменения которые происходят с данными в некоторой таблице.
Тоесть: выполнил
update tbl1 (f1) values (1) where pk=100;
и в таблицу допустим Log записалось:
insert into log
(user_name, table_name, field_name, key_field_value, old_field_value, new_field_value)
values ("user", "tbl1", "f1", "100", "old_val", "new_val");
Конечно это можно просто в треггер before update запихнуть, НО
таблица у меня э...с динамической структурой, а триггер при изменении структуры менять лень.
Тоесть:
create table tbl1
(pk integer not null primary key,f1 integer, f2 integer);
SET TERM !! ;
create trigger UPD_TBL1 for TBL1
before update position 1000
as begin
if (new.f1<>old.f1) then
begin
insert into log
(user_name, table_name, field_name, key_field_value,
old_field_value, new_field_value)
values
(user, "tbl1", "f1", cast(old.pk as varchar), cast(old.f1 as varchar), cast(new.f2 as varchar));
end
/*и дальше оч-ч-чень похожий кусок кода повторится столько раз сколько полей будет у меня в таблице*/
end !!
SET TERM ; !!
Короче чего я хочу: сделать универсальную процедуру которая будет фиксировать все изменения данных в таблице, независимо от структуры таблици.
Вопрос, возможно ли это, и если возможно то как?
P.S. Формировать insert Log с клиента, после удачного выполнения update tbl1, не предлогать. Это уже небудет журнал, это будет... ну не журнал точно!!! Это может подойти для 3-х звеньевой архитектуры, а для 2-х звеньевой никак.
int64 (2003-01-23 16:11:00) [1]Такая таблица вообще не нужна, одного лога хватит. Всегда можно узнать последнее состояние объекта. А все модификации данных сведутся к insert.
К тому же, если и структуре данных предстоит изменяться, то фобия к формированию клиентских запросов вообще безосновательна.
Andrey (2003-01-23 15:02:00) [2]>Для IB6 такого не сделаешь...
Плохо... Значит будут триггеры befor update и befor insert...
Спасиб.
Ops (2003-01-23 14:08:00) [3]не делай old.f1
делай select * по ID до изменения = все старые данные таблицы
делай select * по ID после изменения = все новые данные таблицы
Johnmen (2003-01-23 14:01:00) [4]То есть нужна, фактически, интерпретация строкового значения...
Возможно, она решена в послендих версиях клонов IB.
Для IB6 такого не сделаешь...
Andrey (2003-01-23 13:24:00) [5]>Johnmen
Я ж несобираюсь фиксировать изменения пока таблица неопределена, я хочу фиксировать изменения когда табица уже будет определена, просто нехочется при изменеии структуры таблици менять треггер.
Хочется чтоб тригер анализировал структуру таблици (например через системные таблици IB) и фиксировал изменения во всех полях о которых он узнает в результате этого анализа.
Список полей я уж как-нибудь вытащу, но проблема в том, что я незнаю как обратится к значению поля (old.f1; new.f1) по его имени. Это собственно и есть основная проблемма.
Ops (2003-01-23 13:19:00) [6]Делай таблицу такую для журнала
1. ID
2. Название таблицы
3. Структур таблицы в тек момент
4. Старые данные
5. Новые данные
6. Дата
Johnmen (2003-01-23 12:53:00) [7]>Короче чего я хочу: сделать универсальную процедуру которая
>будет фиксировать все изменения данных в таблице, независимо от
>структуры таблици.
Как можно фиксировать изменения того, что не определено ?