powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Синхронизация изменений в таблице.Remote Procedure/ASA7
5 сообщений из 5, страница 1 из 1
Синхронизация изменений в таблице.Remote Procedure/ASA7
    #35666486
Andreas_84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На одном серваке ASA 7 есть 2 базы.
в них есть абсолютно одинаковые таблицы.
Нужно чтобы при каких либо изменениях в одной таблице ,аналогичные изменения происходили в такойже таблице в другой базе(Репликации не предлагайте)

Думаю можно создать триггер(на delete,insert,update) в котором после получения новых параметров они передаются удалённой процедуре(вызывается в триггере) .Процедура выполняетсяв удалённой базе,делая нужные изменения в другой таблице...

Сработает такая схема)?
Или чего попроще посоветуете??
...
Рейтинг: 0 / 0
Синхронизация изменений в таблице.Remote Procedure/ASA7
    #35666526
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему это "репликацию не предлагайте"? Она как раз для таких задач и существует.

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

А еще можно сделать proxy таблицу в одной из баз и получится всего одна единственная таблица. Которую не надо будет синхронизировать вообще
...
Рейтинг: 0 / 0
Синхронизация изменений в таблице.Remote Procedure/ASA7
    #35667162
Andreas_84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА еще можно сделать proxy таблицу в одной из баз и получится всего одна единственная таблица. Которую не надо будет синхронизировать вообще
так я и сделал..,но есть одно НО.Эта прокси таблица в базе Б(в которой внешние ключи даже определить нельзя) в одном из приложений участвует в запросе многотабличном причём в этом запросе оптимизатор по ходу требует чтобы она полностью была загружена чтобы выполнился запрос..вообщем и запрос там сложный с 2 внешними объединениями.Поэтому уже работающий вариант с прокси таблицей отпадает,ибо тупит сильно((( отрабатывает секунд 14-20(((


White OwlА если строка была создана на базе А и скопирована на Б, как ты в триггерах на Б это определишь и остановишь ее отправку обратно на А?
в принципе копирование изменений нужно только из А в Б поэтому на Б тригеров не будет...

А репликацию если делать то там по моему интервал отправки реплик 1 мин минимум можно определить,или это не так?
А в варианте с триггером быстрее сработает..вот из таких соображений в принципе и пришёл к этому решению...
А больше вариантов нету я так понимаю...
...
Рейтинг: 0 / 0
Синхронизация изменений в таблице.Remote Procedure/ASA7
    #35667497
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автортак я и сделал..,но есть одно НО.Эта прокси таблица в базе Б(в которой внешние ключи даже определить нельзя) в одном из приложений участвует в запросе многотабличном причём в этом запросе оптимизатор по ходу требует чтобы она полностью была загружена чтобы выполнился запрос..вообщем и запрос там сложный с 2 внешними объединениями.Поэтому уже работающий вариант с прокси таблицей отпадает,ибо тупит сильно((( отрабатывает секунд 14-20(((
А Вы не задумывались над таким вариантом, чтобы не насильно гнать все записи из A в Б, а перегнать просто недостающие записи в Б из А, произведя проверку во время выполнения запроса ? ;)

То есть:
1. В А есть таблица
2. В Б есть прокси таблица на таблицу в А
3. В Б есть таблица, аналогичная А

Перед выполнением запроса в Б, теперь достаточно сделать проверку и вставку недостающих записей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT max(id) INTO @max_b FROM b.table;
SELECT max(id) INTO @max_a FROM a.proxy_table WITH (REPEATABLEREAD);
IF @max_b < @max_a THEN
  INSERT INTO b.table 
    SELECT * FROM a.proxy_table WHERE id BETWEEN @max_b AND @max_a;
END IF;

COMMIT;

,,, Дальше сам запрос ...
Таким образом сразу убивается много зайцев:
1. База А не напрягается передачей изменений, они передаются по требованию базы Б
2. База А не рискует откатить транзакцию из за того, что не нашла базу Б
3. База Б держит локальную копию данных и всегда уверена в их актуальности, которая гарантируется перед выполнением запроса
4. Данные в базе Б гарантируют целостность, но не мешают писателям базы А писать новые записи

В роли ключа id подходит числовой primary key или timestamp поле.
...
Рейтинг: 0 / 0
Синхронизация изменений в таблице.Remote Procedure/ASA7
    #35667763
Andreas_84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSавтортак я и сделал..,но есть одно НО.Эта прокси таблица в базе Б(в которой внешние ключи даже определить нельзя) в одном из приложений участвует в запросе многотабличном причём в этом запросе оптимизатор по ходу требует чтобы она полностью была загружена чтобы выполнился запрос..вообщем и запрос там сложный с 2 внешними объединениями.Поэтому уже работающий вариант с прокси таблицей отпадает,ибо тупит сильно((( отрабатывает секунд 14-20(((
А Вы не задумывались над таким вариантом, чтобы не насильно гнать все записи из A в Б, а перегнать просто недостающие записи в Б из А, произведя проверку во время выполнения запроса ? ;)

То есть:
1. В А есть таблица
2. В Б есть прокси таблица на таблицу в А
3. В Б есть таблица, аналогичная А

Перед выполнением запроса в Б, теперь достаточно сделать проверку и вставку недостающих записей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT max(id) INTO @max_b FROM b.table;
SELECT max(id) INTO @max_a FROM a.proxy_table WITH (REPEATABLEREAD);
IF @max_b < @max_a THEN
  INSERT INTO b.table 
    SELECT * FROM a.proxy_table WHERE id BETWEEN @max_b AND @max_a;
END IF;

COMMIT;

,,, Дальше сам запрос ...
Таким образом сразу убивается много зайцев:
1. База А не напрягается передачей изменений, они передаются по требованию базы Б
2. База А не рискует откатить транзакцию из за того, что не нашла базу Б
3. База Б держит локальную копию данных и всегда уверена в их актуальности, которая гарантируется перед выполнением запроса
4. Данные в базе Б гарантируют целостность, но не мешают писателям базы А писать новые записи

В роли ключа id подходит числовой primary key или timestamp поле.

Согласен!Вариант хорош.А что же будет с актуальностью в таблице Б если в таблицу А будет произведён не Insert а Delete or Update???
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Синхронизация изменений в таблице.Remote Procedure/ASA7
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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