powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Репликация
6 сообщений из 6, страница 1 из 1
Репликация
    #36620589
Yurk0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA 9.0.2
SQL Remote

Фрагмент схемы БД представлен на рисунке/

Публикация:
Код: plaintext
1.
2.
3.
4.
CREATE PUBLICATION "DBA"."PUB_REGIONS" (
	TABLE "doc"."DOCUMENTS" SUBSCRIBE BY ID_REGION,
	TABLE "doc"."DOC_STATUS_HISTORY" SUBSCRIBE BY (select ID_REGION from doc.DOCUMENTS where DOCUMENTS.id = doc_status_history.id_doc),
	);

То есть удаленные базы подписаны по значению ID_REGION .

Задача: Вводится новый тип документов, ну например id_doc_type = 50 .
Записи из таблицы DOCUMENTS, где id_doc_type = 50 должны уходить всем удаленным базам (аналогично и соответствующие записи из таблицы DOC_STATUS_HISTORY ).
А для документов других типов, все должно быть по старому..

Вот.... может посоветуете как это реализовать...?
...
Рейтинг: 0 / 0
Репликация
    #36620717
v_smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yurk0,

Решение "в лоб":
- Создать отдельную дополнительную публикацию для этих таблиц по условию where id_doc_type = 50 - реплицировать всюду
- изменить репликацию с поля на функцию (или процедуру), и в функции уже решать что и кому отправлять, составлять список и т.д.

Перечисленные решения в лоб плохи тем что нарушается общая логика репликации для вашей ИС (т.е. усложняется понимание и поддержка в будущем).
...
Рейтинг: 0 / 0
Репликация
    #36631748
Yurk0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v_smirnovYurk0,

Решение "в лоб":
- Создать отдельную дополнительную публикацию для этих таблиц по условию where id_doc_type = 50 - реплицировать всюду
- изменить репликацию с поля на функцию (или процедуру), и в функции уже решать что и кому отправлять, составлять список и т.д.

Перечисленные решения в лоб плохи тем что нарушается общая логика репликации для вашей ИС (т.е. усложняется понимание и поддержка в будущем).

спасибо за советы.
Я думаю вариант с использованием функции более универсален.

Для тестирования, я создал новую базу данных, схема изображена на рисунке.

Таблица D_REGION – справочник "регионов"(удаленных филиалов)
Таблица D_DOC_TYPES – справочник типов документов. Если REP_ALL = 1 — документы етого типа должны отправляться всем "регионам".

Процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE PROCEDURE "DBA"."sp_rep_doc"( in v_id_doc integer )
RESULT( id_region integer ) 
BEGIN
	SELECT ID_REGION FROM "DOC"."DOCUMENTS" as a join "info"."d_doc_types" as b on a.id_doc_type = b.id where b.rep_all =  0  and a.id = v_id_doc
    union
    SELECT c.id FROM ("DOC"."DOCUMENTS" as a join "info"."d_doc_types" as b on a.id_doc_type = b.id),info.d_regions as c where b.rep_all =  1   and a.id = v_id_doc
END;
Публикация:
Код: plaintext
1.
2.
3.
4.
5.
CREATE PUBLICATION "DBA"."PUB_REGIONS" (
	TABLE "info"."D_DOC_TYPES",
	TABLE "info"."D_REGIONS",
	TABLE "doc"."DOC_STATUS_HISTORY" SUBSCRIBE BY (select id_region from DBA.sp_rep_doc(doc_status_history.id_doc)),
	TABLE "doc"."DOCUMENTS" SUBSCRIBE BY (select id_region from DBA.sp_rep_doc(documents.id))
);

Возникла проблема:
Если документ создается в удаленной базе — тогда все в порядке(строки из DOCUMENTS и соответствующие из DOC_STATUS_HISTORY – передаются в консолидированную).
Но если документ создается в консолидированной БД — на удаленные отправляются только строки из DOC_STATUS_HISTORY и соответственно возникает ошибка
Код: plaintext
SQL statement failed: (- 194 ) No primary key value for foreign key 'FK_DOC_STATUS' in table 'DOC_STATUS_HISTORY'

Где здесь может быть ошибка...?
Например для проверки использую следующий запрос(2 - значение подписки):
Код: plaintext
SELECT * FROM "doc"."DOCUMENTS" where  2  in (select id_region from DBA.sp_rep_doc(documents.id))
и он возвращает правильный список записей...
...
Рейтинг: 0 / 0
Репликация
    #36633310
v_smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yurk0,

Давайте в почту (e-mail есть в профиле).
так будет оперативнее.
...
Рейтинг: 0 / 0
Репликация
    #36642597
pand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уточняющий вопрос
как у вас формируется первичный ключ
и что выбирается в
(select id_region from DBA.sp_rep_doc(documents.id)

?

Если вы строите запрос используя выборку из таблицы документов то новой строки там еще нет .

select id_region from
documents inner join d_doc_type
where d_doc_type.in_repl = 1 and documents.id = @id

этот запрос при добавлении новой строки ошибочен. по крайней мене если первичный ключ генерируется автоинкрементом, Если генерить другим способом не проверял , но думаю что результат такой же

можно общеться и через почту
моя PAND {АТ} ukr{тчк}net
...
Рейтинг: 0 / 0
Репликация
    #36644828
Yurk0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v_smirnov и pand , спасибо за помощь!

Схема работает, если публикация выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PUBLICATION "DBA"."PUB_REGIONS" (
	TABLE "info"."D_DOC_TYPES",
	TABLE "info"."D_REGIONS",
	TABLE "doc"."DOC_STATUS_HISTORY" SUBSCRIBE BY (select id_region from DBA.sp_rep_doc(doc_status_history.id_doc)),
	TABLE "doc"."DOCUMENTS" SUBSCRIBE BY 
(select DOCUMENTS.ID_REGION from info.d_doc_types as a where a.id = DOCUMENTS.id_doc_type and a.rep_all =  0  
union
select b.id from info.d_doc_types as a,info.d_regions as b where DOCUMENTS.id_doc_type = a.id and a.rep_all =  1 )
);
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Репликация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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