Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.01 c
1-28861
Скиф
2003-01-30 14:08
2003.02.10
Поиск строки в ini-файле


1-28726
Николай В.
2003-01-31 14:06
2003.02.10
Взаимодействие объектов


6-28966
Korona
2002-12-18 00:14
2003.02.10
TServerSocket и консольное приложение


1-28729
Oleon
2003-01-31 13:04
2003.02.10
Как зная только имя класс в Run-Time создать объект этого класса?


14-29099
Думкин
2003-01-25 10:32
2003.02.10
Думкин день





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский