Страница 1 из 1

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

Добавлено: 29 окт 2004, 12:53
Алексей
Здравствуйте, уважаемые эксперты!

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

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

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

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

Спасибо.

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

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

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

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

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

Добавлено: 01 ноя 2004, 17:27
Алексей
2 OX: Общая идея понятна, спасибо. А есть где-нибудь дока поподробнее почитать?

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

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

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