Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.10;
Скачать: CL | DM;

Вниз

Организация журнал   Найти похожие ветки 

 
Andrey ©   (2003-01-23 12:33) [0]

Собственно мыслей на эту тему почти нет.

Нужно записывать в отдельную таблицу (группу таблиц?) все изменения которые происходят с данными в некоторой таблице.

Тоесть: выполнил
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-х звеньевой никак.


 
Johnmen ©   (2003-01-23 12:53) [1]

>Короче чего я хочу: сделать универсальную процедуру которая
>будет фиксировать все изменения данных в таблице, независимо от
>структуры таблици.

Как можно фиксировать изменения того, что не определено ?


 
Ops   (2003-01-23 13:19) [2]

Делай таблицу такую для журнала
1. ID
2. Название таблицы
3. Структур таблицы в тек момент
4. Старые данные
5. Новые данные
6. Дата



 
Andrey ©   (2003-01-23 13:24) [3]

>Johnmen
Я ж несобираюсь фиксировать изменения пока таблица неопределена, я хочу фиксировать изменения когда табица уже будет определена, просто нехочется при изменеии структуры таблици менять треггер.

Хочется чтоб тригер анализировал структуру таблици (например через системные таблици IB) и фиксировал изменения во всех полях о которых он узнает в результате этого анализа.
Список полей я уж как-нибудь вытащу, но проблема в том, что я незнаю как обратится к значению поля (old.f1; new.f1) по его имени. Это собственно и есть основная проблемма.


 
Johnmen ©   (2003-01-23 14:01) [4]

То есть нужна, фактически, интерпретация строкового значения...
Возможно, она решена в послендих версиях клонов IB.
Для IB6 такого не сделаешь...


 
Ops   (2003-01-23 14:08) [5]

не делай old.f1
делай select * по ID до изменения = все старые данные таблицы
делай select * по ID после изменения = все новые данные таблицы


 
Andrey ©   (2003-01-23 15:02) [6]

>Для IB6 такого не сделаешь...
Плохо... Значит будут триггеры befor update и befor insert...

Спасиб.


 
int64 ©   (2003-01-23 16:11) [7]

Такая таблица вообще не нужна, одного лога хватит. Всегда можно узнать последнее состояние объекта. А все модификации данных сведутся к insert.
К тому же, если и структуре данных предстоит изменяться, то фобия к формированию клиентских запросов вообще безосновательна.



Страницы: 1 вся ветка

Текущий архив: 2003.02.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
1-28786
SaperXL
2003-02-01 20:35
2003.02.10
TRichEdit верхняя строка в редакторе


1-28923
Max_
2003-01-30 20:21
2003.02.10
Дата


3-28641
Dona
2003-01-23 12:57
2003.02.10
Поиск в Гриде


1-28704
MixerPro
2003-01-30 17:12
2003.02.10
Поиск в TreeView


8-28948
DDS
2002-10-28 10:52
2003.02.10
Полупрозрачность?