Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 One-way merge replication.  [new]
Папуша Дмитрий
Member

Откуда: Санкт-Петербург
Сообщений: 131
Всем привет.

Создаю публикацию одной таблицы. Устанавливаю значение @subscriber_upload_options = 2. Все прекрасно работает, с тем лишь условием, что изменение на подписчике мало того что возможны, так еще и реплицируются на издателя. То есть НИКАКИХ изменений при смене значения @subscriber_upload_options я не обнаружил.
Проверяю, захожу в свойства публикации, свойства статьи и вижу Synchronization direction: Download-only to Subscriber, prohibit Subscriber changes.
Редактирование на подписчике возможно как скриптом, так и через UI SSMS.

Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition on Windows NT 6.0 <X86> (Build 6001: Service Pack 1)

Ваши мысли?
1 окт 09, 11:19    [7728554]     Ответить | Цитировать Сообщить модератору
 Re: One-way merge replication.  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Попробуйте SP1 накатить, может, пофиксили?
1 окт 09, 14:15    [7729823]     Ответить | Цитировать Сообщить модератору
 Re: One-way merge replication.  [new]
Папуша Дмитрий
Member

Откуда: Санкт-Петербург
Сообщений: 131
Уф... Накатил. Не пофиксили.

Публикация и подписка создается следующим скриптом.

use source_db
exec sp_replicationdboption @dbname = N'source_db', @optname = N'merge publish', @value = N'true'
exec sp_addmergepublication @publication = N'Test1', @description = N'Merge publication of database ''source_db'' from Publisher ''my_book''.', @sync_mode = N'native', @retention = 14, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'true', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @ftp_port = 21, @ftp_subdirectory = N'ftp', @ftp_login = N'anonymous', @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @dynamic_filters = N'false', @conflict_retention = 14, @keep_partition_changes = N'false', @allow_synctoalternate = N'false', @max_concurrent_merge = 0, @max_concurrent_dynamic_snapshots = 0, @use_partition_groups = null, @publication_compatibility_level = N'100RTM', @replicate_ddl = 1, @allow_subscriber_initiated_snapshot = N'false', @allow_web_synchronization = N'false', @allow_partition_realignment = N'true', @retention_period_unit = N'days', @conflict_logging = N'both', @automatic_reinitialization_policy = 0
exec sp_addpublication_snapshot @publication = N'Test1', @frequency_type = 1, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 500, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0, @job_login = null, @job_password = null, @publisher_security_mode = 1
exec sp_addmergearticle @publication = N'Test1', @article = N'L_Carrier', @source_owner = N'dbo', @source_object = N'L_Carrier', @type = N'table', @description = N'', @creation_script = null, @pre_creation_cmd = N'delete', @schema_option = 0x000000010C034FD1, @identityrangemanagementoption = N'auto', @pub_identity_range = 10000, @identity_range = 1000, @threshold = 80, @destination_owner = N'dbo', @force_reinit_subscription = 1, @column_tracking = N'false', @subset_filterclause = null, @vertical_partition = N'false', @verify_resolver_signature = 1, @allow_interactive_resolver = N'false', @fast_multicol_updateproc = N'true', @check_permissions = 0, @subscriber_upload_options = 2, @delete_tracking = N'true', @compensate_for_errors = N'false', @stream_blob_columns = N'false', @partition_options = 0
exec sp_addmergesubscription @publication = N'Test1', @subscriber = @@SERVERNAME, @subscriber_db = N'destination_db', @subscription_type = N'Push', @sync_type = N'Automatic', @subscriber_type = N'Global', @subscription_priority = 75, @description = null, @use_interactive_resolver = N'False'
exec sp_addmergepushsubscription_agent @publication = N'Test1', @subscriber = @@SERVERNAME, @subscriber_db = N'destination_db', @job_login = null, @job_password = null, @subscriber_security_mode = 1, @publisher_security_mode = 1, @frequency_type = 1, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 0, @active_end_time_of_day = 0, @active_start_date = 0, @active_end_date = 19950101, @enabled_for_syncmgr = N'False'

Ребят, никаких требований, но большая просьба рассказать кто и как настраивал подобную репликацию.
Необходимость в ней возникла как обычно резко и срочно и завтра она должна быть продемонстрирована на тестовом сервере. Пока у меня на нескольких боксах с разными сервис паками и вообще, версиями, эта репликация НЕ работает так как нужно. То есть на подписчике все прекрасно апдейтится и изменения реплицируются на издателя.

Так же эта репликация проверена ( результат тот же ) и на следующем сервере:
Microsoft SQL Server 2005 - 9.00.4035.00 (X64)   Nov 24 2008 16:17:31   Copyright (c) 1988-2005 Microsoft Corporation  Standard Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2) 
Собственно, мне для него ее и нужно создать.
Естественно, то при запуске вышеупомянотого скрипта на 2005ом я менял уровень совместимости с 100 на 90.

Благодарю за идеи и подсказки.
1 окт 09, 22:36    [7732079]     Ответить | Цитировать Сообщить модератору
 Re: One-way merge replication.  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Хм. Судя по тестам, работает только с pull-подписками такая настройка. По меньше мере тест на простейшей таблице с push-подпиской дал описываемый вами результат (никаких ошибок при изменении данных, и измененные данные спокойно закачались на паблишера), а с pull-подпиской попытка изменения данных на подписчике дала такую ошибку:

Msg 20063, Level 16, State 1, Procedure MSmerge_downloadonly_D0D4232969C04105949A7F7CCBE057A6, Line 8
Table '[dbo].[t1]' into which you are trying to insert, update, or delete data has been marked as read-only. Only the merge process can perform these operations.
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.

Пойду почитаю доку, наверняка описано такое поведение.
2 окт 09, 09:55    [7732818]     Ответить | Цитировать Сообщить модератору
 Re: One-way merge replication.  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Собственно, вот. Как и ожидалось:

BOL
[ @subscriber_upload_options = ] subscriber_upload_options

Defines restrictions on updates made at a Subscriber with a client subscription.


Клиентская подписка - это pull.
2 окт 09, 10:00    [7732849]     Ответить | Цитировать Сообщить модератору
 Re: One-way merge replication.  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Вообще говоря, такое поведение обеспечивается очень просто, если посмотреть на базу :-)) На таблицу с такой опцией при настройке подписки сервер вешает следующий триггер:

create trigger MSmerge_downloadonly_D0D4232969C04105949A7F7CCBE057A6 on [dbo].[t1] for update, insert, delete
        not for replication
    as
         set nocount on

        if @@trancount > 0 rollback tran
        raiserror (20063, 16, -1, '[dbo].[t1]')

        return


Так что если вам ну кровь из носу нужна именно push-подписка, и завтра сдавать прототип, и если не сдадите, то 3-я мировая наступит, то повесьте такие триггера на свои таблицы на подписчике для push-подписки.
2 окт 09, 10:08    [7732916]     Ответить | Цитировать Сообщить модератору
 Re: One-way merge replication.  [new]
ABV
Member

Откуда: Minsk
Сообщений: 88
И на SQL 2005 то же самое.
2 окт 09, 17:49    [7736699]     Ответить | Цитировать Сообщить модератору
 Re: One-way merge replication.  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Видать, не успел автор до показа прочитать... Жалко :-(
2 окт 09, 20:26    [7737150]     Ответить | Цитировать Сообщить модератору
 Re: One-way merge replication.  [new]
Папуша Дмитрий
Member

Откуда: Санкт-Петербург
Сообщений: 131
Утра доброго!

Низкий поклон Вам, GreenSunrise. Не знаю, как выражать благодарность в подобных случаях, но искренне жму Вашу руку.
Прочесть успел, ответить времени не было - всю пятницу и субботу накатывались ( и, ой братцы, фиксились ) изменения в тестовой среду.
Признаться, пулл подписка мне не помогла. Но не буду утверждать, что я сделал все верно.. публикация создавалась по тому же скрипту, можно сказать. С той лишь разницей, что подписка была сделана вручную и теперь была типа pull. Это было проделано лишь на 2008м с СП1 сервере. Триггер не создался.
НО! Пост с триггером оказался в высшей степени полезным.

Еще раз благодарю и с уважением кланяюсь.
5 окт 09, 10:31    [7741158]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить