Как записать выполненный SQL

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Deniz
Сообщения: 7
Зарегистрирован: 27 окт 2004, 06:38

Сообщение Deniz » 30 окт 2004, 07:27

Merlin писал(а):Внимание, вопрос. Що будем делать с этой записью в external table в случае ежели за оным update последовал rollback транзакции, в которой он выполнялся?
Согласен не сказал, что внешние таблицы вне транзакции, но заметьте, там было написано "... для логирования действий ..." а не для репликации, а в некоторых случаях нужно именно все действия логировать, даже те, которые отменились. Все зависит от логики приложения.
Вопрос снят?

Andrew Kruchinin
Сообщения: 6
Зарегистрирован: 27 окт 2004, 06:35

Сообщение Andrew Kruchinin » 30 окт 2004, 17:36

Merlin писал(а): Внимание, вопрос. Що будем делать с этой записью в external table в случае ежели за оным update последовал rollback транзакции, в которой он выполнялся?
Я что-то не догнал наверное? After Insert/Update/Delete и какая речь об откатах?

Deniz
Сообщения: 7
Зарегистрирован: 27 окт 2004, 06:38

Сообщение Deniz » 31 окт 2004, 10:31

Andrew Kruchinin писал(а):Я что-то не догнал наверное? After Insert/Update/Delete и какая речь об откатах?
Подгоняю ;-)
After Insert/Update/Delete это для таблиц, но нужно еще и транзакцию закомитить, тогда все изменения остануться. Т.е пример:

Код: Выделить всё

Start transaction

before insert table1
insert into table1
after insert table1

before insert table2
insert into table2
after insert table2

Commit transaction или Rollback transaction
При rollback ничего в table1 и table2 не сохраниться(если таблицы не внешние). А если table2 внешняя, то при Rollback в table1 изменений не будет, а в table2 все останется.

olegenty
Сообщения: 5
Зарегистрирован: 31 окт 2004, 14:31

Сообщение olegenty » 31 окт 2004, 14:45

Автору топика
А ты каким средством администрирования базы данных пользуешься?
Может стоит воспользоваться IBExpert и его возможностью "логгирования" данных? Настраивается всё это средствами самого же IBExperta, все необходимые триггеры он, опять же, сам создаст... (их, при желании, несложно поправить руками)...

А уж с таблицами логов делать можно, что угодно. Например, после слива из дих некотого "дельта" изменений, удалять эту самую порцию "дельта" до следующего акта синхронизации...

Klyk
Сообщения: 100
Зарегистрирован: 26 окт 2004, 23:28

Сообщение Klyk » 03 ноя 2004, 23:17

Может стоит воспользоваться IBExpert и его возможностью "логгирования" данных?
Спасибо. Это действительно помогло решить проблему :))

Андрей
Сообщения: 17
Зарегистрирован: 26 окт 2004, 17:51

Сообщение Андрей » 17 ноя 2004, 19:08

Klyk писал(а):На самом деле зачем это всё надо.
Есть 2 БД, связь между которыми - невозможна, следовательно репликатор неподходит. А изменения в одной БД надо отображать в другой. Есть возможность передачи только текстовых файлов (раз в сутки).
Вот я и думал создавать SQL скрипты при изменении данных в одной БД и выполнять этот скритп для изменения второй БД.
Может есть и другие идеи...
Вообще-то все делается гораздо проще:
1) Каждая таблица должна иметь поля DateCreate,DateModify, которые модифицируются в тригерах Insert, Update
2) Пишешь процедурку, которая создает следующий SQL-script
а) вставляет все записи, которые появились после DateTime
б) обновляет все записи, которые изменились после DateTime
И этот скрипт передаешь по мылу, а на месте всасываешь в БД

Проблема с удаленными записями, для этого нужно вести полное протоколирование действий пользователей - функция весьма необходиая в бухгалтерских системах.

Такой метод позволяет решить и другие проблемы, такие как перенос данных в БД разной структуры

Использование для репликации IBExpert чревато подводными камнями.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 18 ноя 2004, 12:47

Андрей писал(а):
Вообще-то все делается гораздо проще:
1) Каждая таблица должна иметь поля DateCreate,DateModify, которые модифицируются в тригерах Insert, Update
2) Пишешь процедурку, которая создает следующий SQL-script
а) вставляет все записи, которые появились после DateTime
б) обновляет все записи, которые изменились после DateTime
И этот скрипт передаешь по мылу, а на месте всасываешь в БД
Бред-с, извините. Во-первых, для этого Current_Timestamp или Now должны возвращать время коммита, а не выполнения операции, чего оне, безусловно, не делают, ибо делать не могут. Такой подход прокатит исключительно в случае выполнения указанной процедуры разогнавши всех усеров нафик, то есть в монопольном режиме, чтобы во время снятия реплики не было некоммиченных изменений.
Андрей писал(а): для этого нужно вести полное протоколирование действий пользователей
Вот именно. И удалять из лога данные о снятых изменениях или метить их "читано" при снятии.
Андрей писал(а): Использование для репликации IBExpert чревато подводными камнями.
Ну, подводными камнями чревато вообще всё, жить в принципе опасно и вредно. А вот организовать ведение лога силами IBExpert вполне разумно.

Гость

Сообщение Гость » 18 ноя 2004, 13:07

Merlin писал(а): Бред-с, извините. Во-первых, для этого Current_Timestamp или Now должны возвращать время коммита, а не выполнения операции, чего оне, безусловно, не делают, ибо делать не могут. Такой подход прокатит исключительно в случае выполнения указанной процедуры разогнавши всех усеров нафик, то есть в монопольном режиме, чтобы во время снятия реплики не было некоммиченных изменений.
Во-первых, для его задачи не требуется знать обо всех изменениях БД, требуется только фиксировать состояние БД на конкретный момент времени - раз в сутки или трое (выходные) а этот подход отлично решает эту задачу.
Во-вторых, протоколирование нужно не полное, а только для удаленных записей, а это очень маленький объем - проверено.
Merlin писал(а): Ну, подводными камнями чревато вообще всё, жить в принципе опасно и вредно. А вот организовать ведение лога силами IBExpert вполне разумно.
Если ты любитель IBExpert, то так и скажи.
Я не против любых инструментов, если они в чем то помогают.
Но я за час нашел в IBExpert десяток проблем и поэтому осторожен
НАпример, посмотри скрипт репликации, который он выдает - он отключает все ограничения и тригера, вставляет данные, а потом включает. А это нарушение ссылочной целостности.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 18 ноя 2004, 14:02

Anonymous писал(а): Во-первых, для его задачи не требуется знать обо всех изменениях БД, требуется только фиксировать состояние БД на конкретный момент времени - раз в сутки или трое (выходные) а этот подход отлично решает эту задачу.
Любопытно. Раз в сутки плавно превратился в трое, а потом даже в неделю (выходные). Брюки превращаются... (С). Ещё раз: этот подход является велосипедом с многоугольными колёсами - в принципе может и поехать, но интенсивность ударов по многострадальной сильно зависит от количества углов. При модификации метаданных требует модификации алгоритмов съёма-наката или включения в эти алгоритмы блока топологического анализа reference integrity, требует необходимости озаботиться гарантированным отстутствием активности юзеров в момент снятия реплики. Ещё такой провокационный вопросик - что будем накатывать вперёд, а что потом - лог делетов или данные из таблиц? Или всё-таки бум думать о последовательности, в которой выполнялись операторы? А последовательность тоже бум по таймштампу с дискретом в секунду ловить или где? Тут пространство для раздумий веееесьма обширное ;)
Anonymous писал(а): Во-вторых, протоколирование нужно не полное, а только для удаленных записей, а это очень маленький объем - проверено.
Первое в общем случае неверно, второе расскажи например ребятам с биллинговыми системами, обхохочутся :)
Anonymous писал(а): Если ты любитель IBExpert, то так и скажи.
Не угадал. Я любитель WISQL и isql.
Anonymous писал(а): НАпример, посмотри скрипт репликации, который он выдает - он отключает все ограничения и тригера, вставляет данные, а потом включает. А это нарушение ссылочной целостности.
Не буду смотреть, лень. В таком случае это скрипт не репликации, а пампа данных в монопольном режиме. А вот полуавтоматом IBExpert для ведения лога для репликации (идея стянута с ранних версий IBLogManager во времена их дружбы) - массированное создание триггеров по заданному шаблону - совершенно не грешно воспользоваться. Правда такая приблуда для себя любимого пишется за пару часов, но если есть, то почему не воспользоваться. Кстати, логом можно пользоваться и в режиме снятия текущего состояния: хранить в нём таблица - id - оператор, а данные тянуть с основных таблиц. Это колесо уже некруглое, требует дополнительной возни и возможны парадоксы, но во многих случаях ещё приемлемое.

Ответить