powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обобщенный протокол изменений
11 сообщений из 11, страница 1 из 1
Обобщенный протокол изменений
    #38413404
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Возникла необходимость протоколирования изменений в таблице примерно такого вида:
Код: sql
1.
2.
3.
4.
5.
create table A (ID integer not null primary key,
 S_DATE date
 F_DATE_date,
 F_A integer,
 F_B integer);

Особенность ситуации в том, что строки зависимы друг от друга и при внесении изменений в одну из них, пересчитываются некоторые другие. Кроме того, изменения в одни и те же поля могут вноситься в течение одной транзакции несколько раз с целью подбора оптимальных значений всего набора (своеобразный excel-style). Первоначально протокол велся аналогично модели IBExpert с мелкими поправками на особенности. Нужно обеспечить ведение протокола таким образом, чтобы вместо трех записей в протоколе вида:
Код: sql
1.
2.
3.
F_A.OLD=22     F_A.NEW=33
F_A.OLD=33     F_B.NEW=98
F_A.OLD=98     F_A.NEW=06

фигурировала одна строка
Код: sql
1.
F_A.OLD=22     F_B.NEW=06

Т.е. протоколирование построчных изменений не вариант. Возникла идея в триггере AIU первых изменений в транзакции инициализировать специальную контекстную переменную в пространстве имен транзакции и при последующих изменениях просто перезаписывать новые значения полей.

Покритикуйте, плиз, подход. Ну, или иные варианты предложите :-)
...
Рейтинг: 0 / 0
Обобщенный протокол изменений
    #38413415
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevНужно обеспечить ведение протокола таким образом, чтобы вместо трех
записей в протоколе вида:
фигурировала одна строка
Замени в триггере INSERT на MERGE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обобщенный протокол изменений
    #38413684
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЗамени в триггере INSERT на MERGEНе очень понял, чем поможет...
...
Рейтинг: 0 / 0
Обобщенный протокол изменений
    #38413688
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevНе очень понял, чем поможет...
Всем. Будет тебе нужный результат. Только в ветке match не меняй старое значение поля.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обобщенный протокол изменений
    #38413697
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
MERGE в привязке к номеру транзакции?
...
Рейтинг: 0 / 0
Обобщенный протокол изменений
    #38413704
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevMERGE в привязке к номеру транзакции?
В привязке к номеру записи, изменения в которой ты протоколируешь.

Ну, или, если MERGE для тебя слишком сложно, можешь использовать классический код:
Код: sql
1.
2.
3.
UPDATE ...
IF (ROW_COUNT = 0) THEN
   INSERT ...


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обобщенный протокол изменений
    #38413710
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
да здесь не в синтаксисе MERGE дело, я пока концептуально не все разложил. Завтра попробую предполагаемый вариант выложить
...
Рейтинг: 0 / 0
Обобщенный протокол изменений
    #38413714
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill Razuvaevда здесь не в синтаксисе MERGE дело, я пока концептуально не все
разложил.
Ты хочешь несколько последовательных записей сложить в одну. Это делается оператором
UPDATE. По первому изменению в таблице А запись в лог добавляешь, по последующим - уже
добавленную в лог запись обновляешь.

Не, конечно, ты можешь и с переменными побаловаться, я ж не настаиваю...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обобщенный протокол изменений
    #38413894
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПо первому изменению в таблице А запись в лог добавляешь, по последующим - уже добавленную в лог запись обновляешь. Да, но есть нюанс - нужно отличить изменения, сделанные пять минут назад (утром, вчера) от изменений в текущей транзакции. Вот и получается, что нужно точно идентифицировать изменения текущей транзакции. Вариантов вижу два:
- либо привязываться (matching) к current_transaction, что не тянет на первичный ключ таблицы по понятным причинам, и, следовательно не слишком эффективно для update
- либо при первом изменении в транзакции инициализировать генератором контекстную переменную, получая и ID, и PK. А при повторных - просто перезаписывать новые значения полей.
...
Рейтинг: 0 / 0
Обобщенный протокол изменений
    #38414021
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill Razuvaev, использовать в качетве [части] первичного ключа идентификатор транзакции + 14909651 - почему нет?
...
Рейтинг: 0 / 0
Обобщенный протокол изменений
    #38414073
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill Razuvaevесть нюанс - нужно отличить изменения, сделанные пять минут назад
(утром, вчера) от изменений в текущей транзакции.
Веди протокол во временной таблице, а по коммиту сбрасывай её в основную. Всяк меньше
геморроя чем с переменными.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обобщенный протокол изменений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]