Репликация + хранимые процедуры

Методы, механизмы и инструментарий для репликации

Модератор: kdv

Ответить
Алексей
Сообщения: 3
Зарегистрирован: 29 окт 2004, 12:33

Репликация + хранимые процедуры

Сообщение Алексей » 29 окт 2004, 12:53

Здравствуйте, уважаемые эксперты!

Мой вопрос из разряда ламерских, поэтому сразу прошу прояаить немного
терпения и не относиться слишком строго:)

Суть состоит в следующем: есть несколько идентичных по структуре баз данных, которые требуется синхронизировать(только данные), причем не полностью, а частично(т. е. разные части разных баз друг с другом). Все insert, update и delete запросы в них инкапсулированы в хранимые процедуры. Собственно, метод синхронизации я уже придумал. Он состоит в том, чтобы логировать все действия в таблице (имя процедуры и поступившие параметры) в одной БД, а затем исполнять необходимые в другой.

Теперь сам вопрос: есть ли какой-либо способ узнать внутри ХП ее имя и параметры?

Возможно я пытаюсь изобрести велосипед и предложенный мною метод вообще неэффективен - посоветуйте что-то более подходящее.

Спасибо.

OX
Сообщения: 24
Зарегистрирован: 26 окт 2004, 17:08

Сообщение OX » 01 ноя 2004, 11:40

Для формирования лога наката рекомендую использовать IBExpert,
"Менеджер протоколов данных", в твоей БД будет создано четыре таблицы:
- IBE$LOG_TABLES;
- IBE$LOG_KEYS;
- IBE$LOG_FIELDS;
- IBE$LOG_BLOB_FIELDS;
и необходимые триггера, в триггерах укажешь какие изменения необходимо протоколировать, а в репликаторе - правила формирования параметров хранимых процедур. У меня правила хранятся в той же БД, формирование параметров через EXECUTE STATEMENT(только для Firebird 1.5.x).

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Репликация + хранимые процедуры

Сообщение kdv » 01 ноя 2004, 11:48

Алексей писал(а):хранимые процедуры. Собственно, метод синхронизации я уже придумал. Он состоит в том, чтобы логировать все действия в таблице (имя процедуры и поступившие параметры) в одной БД, а затем исполнять необходимые в другой.

Теперь сам вопрос: есть ли какой-либо способ узнать внутри ХП ее имя и параметры?
а смысл? внутри процедуры ты УЖЕ знаешь ее имя и входные параметры.
insert into procedure_call_log values ('PROC1', current_timestamp)...
хотя по timestamp вообще то делать репликацию нехорошо. 2 операции могут пойти с одним и тем же временем.

Алексей
Сообщения: 3
Зарегистрирован: 29 окт 2004, 12:33

Сообщение Алексей » 01 ноя 2004, 17:24

а смысл? внутри процедуры ты УЖЕ знаешь ее имя и входные параметры.
insert into procedure_call_log values ('PROC1', current_timestamp)...
хотя по timestamp вообще то делать репликацию нехорошо. 2 операции могут пойти с одним и тем же временем.
Все бы хорошо, но в этом случае прийдется добивать этот код в каждую ХП по отдельности, а так написал единый кусок и вставляй везде где надо

Алексей
Сообщения: 3
Зарегистрирован: 29 окт 2004, 12:33

Сообщение Алексей » 01 ноя 2004, 17:27

2 OX: Общая идея понятна, спасибо. А есть где-нибудь дока поподробнее почитать?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 ноя 2004, 19:21

Алексей писал(а): Все бы хорошо, но в этом случае прийдется добивать этот код в каждую ХП по отдельности, а так написал единый кусок и вставляй везде где надо
каждая ХП все равно содержит свой кусок кода. потом, у нас PSQL не интерпретируется, а компилируется, поэтому динамически количество параметров определять и куда то заполнять если и получится, то с серьезными выкрутасами с execute statement. Проще будет как раз "добивать код". Его и так и эдак придется вписывать, разный или одинаковый.

И все таки эта идея не очень хорошая. Формировать лог sql операторов (а у тебя эквивалент этому - лог вызова процедур) - это годится только для аудита, т.е. мониторинга какой клиент что и когда вызывал. а вот для репликации уже будут конфликты и аномалии, хотя бы потому что если 10 твоих разных процедур выполнить с интервалом в 1 сек одну за другой - это одно (с разных клиентов). А если попытаться выполнить то же самое через репликатор, который не будет соблюдать эти интервалы - может получиться совершенно другое. Поэтому вся репликация на IB/FB/YA основана именно на реплицировании изменений в самих таблицах, а не в репликации логов каких либо высокоуровневых вызовов...

OX
Сообщения: 24
Зарегистрирован: 26 окт 2004, 17:08

Сообщение OX » 02 ноя 2004, 15:49

Алексей писал(а):2 OX: Общая идея понятна, спасибо. А есть где-нибудь дока поподробнее почитать?
По работе с IBExpert, все достаточно прозрачно, выбираешь таблицу,
жмешь кнопку "Подготовить таблицу для протоколирования", далее выбираешь необходимые действия (I,U,D) и указываешь поля для протоколирования.
По EXECUTE STATEMENT - http://www.ibase.ru/firebird/fb_1_5_releasenotes.pdf
А реализация правил репликации зависит от конкретной задачи, общие идеи хорошо изложены в разделе "статьи" ibase.ru, за что уважаемому kdv отдельное спасибо :)

Ответить