Репликация + хранимые процедуры
Модератор: kdv
Репликация + хранимые процедуры
Здравствуйте, уважаемые эксперты!
Мой вопрос из разряда ламерских, поэтому сразу прошу прояаить немного
терпения и не относиться слишком строго:)
Суть состоит в следующем: есть несколько идентичных по структуре баз данных, которые требуется синхронизировать(только данные), причем не полностью, а частично(т. е. разные части разных баз друг с другом). Все insert, update и delete запросы в них инкапсулированы в хранимые процедуры. Собственно, метод синхронизации я уже придумал. Он состоит в том, чтобы логировать все действия в таблице (имя процедуры и поступившие параметры) в одной БД, а затем исполнять необходимые в другой.
Теперь сам вопрос: есть ли какой-либо способ узнать внутри ХП ее имя и параметры?
Возможно я пытаюсь изобрести велосипед и предложенный мною метод вообще неэффективен - посоветуйте что-то более подходящее.
Спасибо.
Мой вопрос из разряда ламерских, поэтому сразу прошу прояаить немного
терпения и не относиться слишком строго:)
Суть состоит в следующем: есть несколько идентичных по структуре баз данных, которые требуется синхронизировать(только данные), причем не полностью, а частично(т. е. разные части разных баз друг с другом). Все insert, update и delete запросы в них инкапсулированы в хранимые процедуры. Собственно, метод синхронизации я уже придумал. Он состоит в том, чтобы логировать все действия в таблице (имя процедуры и поступившие параметры) в одной БД, а затем исполнять необходимые в другой.
Теперь сам вопрос: есть ли какой-либо способ узнать внутри ХП ее имя и параметры?
Возможно я пытаюсь изобрести велосипед и предложенный мною метод вообще неэффективен - посоветуйте что-то более подходящее.
Спасибо.
Для формирования лога наката рекомендую использовать IBExpert,
"Менеджер протоколов данных", в твоей БД будет создано четыре таблицы:
- IBE$LOG_TABLES;
- IBE$LOG_KEYS;
- IBE$LOG_FIELDS;
- IBE$LOG_BLOB_FIELDS;
и необходимые триггера, в триггерах укажешь какие изменения необходимо протоколировать, а в репликаторе - правила формирования параметров хранимых процедур. У меня правила хранятся в той же БД, формирование параметров через EXECUTE STATEMENT(только для Firebird 1.5.x).
"Менеджер протоколов данных", в твоей БД будет создано четыре таблицы:
- IBE$LOG_TABLES;
- IBE$LOG_KEYS;
- IBE$LOG_FIELDS;
- IBE$LOG_BLOB_FIELDS;
и необходимые триггера, в триггерах укажешь какие изменения необходимо протоколировать, а в репликаторе - правила формирования параметров хранимых процедур. У меня правила хранятся в той же БД, формирование параметров через EXECUTE STATEMENT(только для Firebird 1.5.x).
Re: Репликация + хранимые процедуры
а смысл? внутри процедуры ты УЖЕ знаешь ее имя и входные параметры.Алексей писал(а):хранимые процедуры. Собственно, метод синхронизации я уже придумал. Он состоит в том, чтобы логировать все действия в таблице (имя процедуры и поступившие параметры) в одной БД, а затем исполнять необходимые в другой.
Теперь сам вопрос: есть ли какой-либо способ узнать внутри ХП ее имя и параметры?
insert into procedure_call_log values ('PROC1', current_timestamp)...
хотя по timestamp вообще то делать репликацию нехорошо. 2 операции могут пойти с одним и тем же временем.
Все бы хорошо, но в этом случае прийдется добивать этот код в каждую ХП по отдельности, а так написал единый кусок и вставляй везде где надоа смысл? внутри процедуры ты УЖЕ знаешь ее имя и входные параметры.
insert into procedure_call_log values ('PROC1', current_timestamp)...
хотя по timestamp вообще то делать репликацию нехорошо. 2 операции могут пойти с одним и тем же временем.
каждая ХП все равно содержит свой кусок кода. потом, у нас PSQL не интерпретируется, а компилируется, поэтому динамически количество параметров определять и куда то заполнять если и получится, то с серьезными выкрутасами с execute statement. Проще будет как раз "добивать код". Его и так и эдак придется вписывать, разный или одинаковый.Алексей писал(а): Все бы хорошо, но в этом случае прийдется добивать этот код в каждую ХП по отдельности, а так написал единый кусок и вставляй везде где надо
И все таки эта идея не очень хорошая. Формировать лог sql операторов (а у тебя эквивалент этому - лог вызова процедур) - это годится только для аудита, т.е. мониторинга какой клиент что и когда вызывал. а вот для репликации уже будут конфликты и аномалии, хотя бы потому что если 10 твоих разных процедур выполнить с интервалом в 1 сек одну за другой - это одно (с разных клиентов). А если попытаться выполнить то же самое через репликатор, который не будет соблюдать эти интервалы - может получиться совершенно другое. Поэтому вся репликация на IB/FB/YA основана именно на реплицировании изменений в самих таблицах, а не в репликации логов каких либо высокоуровневых вызовов...
По работе с IBExpert, все достаточно прозрачно, выбираешь таблицу,Алексей писал(а):2 OX: Общая идея понятна, спасибо. А есть где-нибудь дока поподробнее почитать?
жмешь кнопку "Подготовить таблицу для протоколирования", далее выбираешь необходимые действия (I,U,D) и указываешь поля для протоколирования.
По EXECUTE STATEMENT - http://www.ibase.ru/firebird/fb_1_5_releasenotes.pdf
А реализация правил репликации зависит от конкретной задачи, общие идеи хорошо изложены в разделе "статьи" ibase.ru, за что уважаемому kdv отдельное спасибо