假设我们要创建合并复制的发布端数据库是EFDemo其中有四张表,订阅端数据库是EFDemoSubscription,如下图所示:

首先创建发布端快照代理Sql agent job:"EFDemoMergePublicationJob":

  1. USE [msdb]
  2. GO
  3.  
  4. /****** Object: Job [EFDemoMergePublicationJob] Script Date: 11/29/2018 12:59:12 PM ******/
  5. BEGIN TRANSACTION
  6. DECLARE @ReturnCode INT
  7. SELECT @ReturnCode = 0
  8. /****** Object: JobCategory [REPL-Snapshot] Script Date: 11/29/2018 12:59:12 PM ******/
  9. IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'REPL-Snapshot' AND category_class=1)
  10. BEGIN
  11. EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'REPL-Snapshot'
  12. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  13.  
  14. END
  15.  
  16. DECLARE @jobId BINARY(16)
  17. EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'EFDemoMergePublicationJob',
  18. @enabled=1,
  19. @notify_level_eventlog=0,
  20. @notify_level_email=0,
  21. @notify_level_netsend=0,
  22. @notify_level_page=0,
  23. @delete_level=0,
  24. @description=N'No description available.',
  25. @category_name=N'REPL-Snapshot',
  26. @owner_login_name=N'domain\scott', @job_id = @jobId OUTPUT
  27. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  28. /****** Object: Step [Snapshot Agent startup message.] Script Date: 11/29/2018 12:59:12 PM ******/
  29. EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Snapshot Agent startup message.',
  30. @step_id=1,
  31. @cmdexec_success_code=0,
  32. @on_success_action=3,
  33. @on_success_step_id=0,
  34. @on_fail_action=3,
  35. @on_fail_step_id=0,
  36. @retry_attempts=0,
  37. @retry_interval=0,
  38. @os_run_priority=0, @subsystem=N'TSQL',
  39. @command=N'sp_MSadd_snapshot_history @perfmon_increment = 0, @agent_id = 4, @runstatus = 1,
  40. @comments = N''Starting agent.''',
  41. @server=N'DB_Server_001',
  42. @database_name=N'distribution',
  43. @flags=0
  44. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  45. /****** Object: Step [Run agent.] Script Date: 11/29/2018 12:59:12 PM ******/
  46. EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Run agent.',
  47. @step_id=2,
  48. @cmdexec_success_code=0,
  49. @on_success_action=1,
  50. @on_success_step_id=0,
  51. @on_fail_action=3,
  52. @on_fail_step_id=0,
  53. @retry_attempts=10,
  54. @retry_interval=1,
  55. @os_run_priority=0, @subsystem=N'Snapshot',
  56. @command=N'-Publisher [DB_Server_001] -PublisherDB [EFDemo] -Distributor [DB_Server_001] -Publication [EFDemoMerge] -ReplicationType 2 -DistributorSecurityMode 1 ',
  57. @server=N'DB_Server_001',
  58. @database_name=N'distribution',
  59. @flags=0
  60. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  61. /****** Object: Step [Detect nonlogged agent shutdown.] Script Date: 11/29/2018 12:59:12 PM ******/
  62. EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Detect nonlogged agent shutdown.',
  63. @step_id=3,
  64. @cmdexec_success_code=0,
  65. @on_success_action=2,
  66. @on_success_step_id=0,
  67. @on_fail_action=2,
  68. @on_fail_step_id=0,
  69. @retry_attempts=0,
  70. @retry_interval=0,
  71. @os_run_priority=0, @subsystem=N'TSQL',
  72. @command=N'sp_MSdetect_nonlogged_shutdown @subsystem = ''Snapshot'', @agent_id = 4',
  73. @server=N'DB_Server_001',
  74. @database_name=N'distribution',
  75. @flags=0
  76. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  77. EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
  78. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  79. EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Replication agent schedule.',
  80. @enabled=1,
  81. @freq_type=4,
  82. @freq_interval=14,
  83. @freq_subday_type=1,
  84. @freq_subday_interval=5,
  85. @freq_relative_interval=1,
  86. @freq_recurrence_factor=0,
  87. @active_start_date=20181129,
  88. @active_end_date=99991231,
  89. @active_start_time=500,
  90. @active_end_time=235959,
  91. @schedule_uid=N'561c3b92-52c3-4661-b3c3-916807f2db2a'
  92. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  93. EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
  94. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  95. COMMIT TRANSACTION
  96. GOTO EndSave
  97. QuitWithRollback:
  98. IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
  99. EndSave:
  100. GO

然后创建订阅端数据同步Sql agent job:"EFDemoMergeSubscriptionJob":

  1. USE [msdb]
  2. GO
  3.  
  4. /****** Object: Job [EFDemoMergeSubscriptionJob] Script Date: 11/29/2018 12:57:11 PM ******/
  5. BEGIN TRANSACTION
  6. DECLARE @ReturnCode INT
  7. SELECT @ReturnCode = 0
  8. /****** Object: JobCategory [REPL-Merge] Script Date: 11/29/2018 12:57:11 PM ******/
  9. IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'REPL-Merge' AND category_class=1)
  10. BEGIN
  11. EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'REPL-Merge'
  12. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  13.  
  14. END
  15.  
  16. DECLARE @jobId BINARY(16)
  17. EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'EFDemoMergeSubscriptionJob',
  18. @enabled=1,
  19. @notify_level_eventlog=2,
  20. @notify_level_email=0,
  21. @notify_level_netsend=0,
  22. @notify_level_page=0,
  23. @delete_level=0,
  24. @description=N'No description available.',
  25. @category_name=N'REPL-Merge',
  26. @owner_login_name=N'domain\scott', @job_id = @jobId OUTPUT
  27. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  28. /****** Object: Step [Merge Agent startup message.] Script Date: 11/29/2018 12:57:11 PM ******/
  29. EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Merge Agent startup message.',
  30. @step_id=1,
  31. @cmdexec_success_code=0,
  32. @on_success_action=3,
  33. @on_success_step_id=0,
  34. @on_fail_action=3,
  35. @on_fail_step_id=0,
  36. @retry_attempts=0,
  37. @retry_interval=0,
  38. @os_run_priority=0, @subsystem=N'TSQL',
  39. @command=N'sp_MSadd_merge_history @perfmon_increment = 0, @agent_id = 4, @runstatus = 1,
  40. @comments = N''Starting agent.''',
  41. @server=N'DB_Server_001',
  42. @database_name=N'distribution',
  43. @flags=0
  44. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  45. /****** Object: Step [Run agent.] Script Date: 11/29/2018 12:57:11 PM ******/
  46. EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Run agent.',
  47. @step_id=2,
  48. @cmdexec_success_code=0,
  49. @on_success_action=1,
  50. @on_success_step_id=0,
  51. @on_fail_action=3,
  52. @on_fail_step_id=0,
  53. @retry_attempts=10,
  54. @retry_interval=1,
  55. @os_run_priority=0, @subsystem=N'Merge',
  56. @command=N'-Publisher [DB_Server_001] -PublisherDB [EFDemo] -Publication [EFDemoMerge] -Subscriber [DB_Server_001] -SubscriberDB [EFDemoSubscription] -Distributor [DB_Server_001] -DistributorSecurityMode 1 ',
  57. @server=N'DB_Server_001',
  58. @database_name=N'distribution',
  59. @flags=0
  60. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  61. /****** Object: Step [Detect nonlogged agent shutdown.] Script Date: 11/29/2018 12:57:11 PM ******/
  62. EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Detect nonlogged agent shutdown.',
  63. @step_id=3,
  64. @cmdexec_success_code=0,
  65. @on_success_action=2,
  66. @on_success_step_id=0,
  67. @on_fail_action=2,
  68. @on_fail_step_id=0,
  69. @retry_attempts=0,
  70. @retry_interval=0,
  71. @os_run_priority=0, @subsystem=N'TSQL',
  72. @command=N'sp_MSdetect_nonlogged_shutdown @subsystem = ''Merge'', @agent_id = 4',
  73. @server=N'DB_Server_001',
  74. @database_name=N'distribution',
  75. @flags=0
  76. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  77. EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
  78. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  79. EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Replication agent schedule.',
  80. @enabled=0,
  81. @freq_type=1,
  82. @freq_interval=0,
  83. @freq_subday_type=0,
  84. @freq_subday_interval=0,
  85. @freq_relative_interval=0,
  86. @freq_recurrence_factor=0,
  87. @active_start_date=20181129,
  88. @active_end_date=99991231,
  89. @active_start_time=0,
  90. @active_end_time=235959,
  91. @schedule_uid=N'ad0c8cc4-c11e-4b9e-8f23-234f37e29925'
  92. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  93. EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
  94. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  95. COMMIT TRANSACTION
  96. GOTO EndSave
  97. QuitWithRollback:
  98. IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
  99. EndSave:
  100. GO

然后就可以开始创建合并复制了:

  1. -- 添加合并复制功能(合并复制自动创建的系统表)到发布端数据库EFDemo
  2. use master
  3. exec sp_replicationdboption @dbname = N'EFDemo', @optname = N'merge publish', @value = N'true'
  4. GO
  5.  
  6. -- 添加合并复制EFDemoMerge,即发布端
  7. use [EFDemo]
  8. exec sp_addmergepublication @publication = N'EFDemoMerge', @description = N'Merge publication of database ''EFDemo'' from Publisher ''DB_Server_001''.', @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 = N'false', @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
  9. GO
  10.  
  11. -- 将前面创建的发布端快照代理Sql agent job:"EFDemoMergePublicationJob"分配给合并复制的发布端
  12. -- 注意@publisher_login , @publisher_password 两个参数是发布端数据库的管理员用户名和密码
  13. exec sp_addpublication_snapshot @snapshot_job_name=N'EFDemoMergePublicationJob', @publication = N'EFDemoMerge', @frequency_type = 4, @frequency_interval = 14, @frequency_relative_interval = 1, @frequency_recurrence_factor = 0, @frequency_subday = 1, @frequency_subday_interval = 5, @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 = 0, @publisher_login = N'Distribution', @publisher_password = N'1qaz!QAZ'
  14. exec sp_grant_publication_access @publication = N'EFDemoMerge', @login = N'sa'
  15. GO
  16.  
  17. -- 添加可以访问合并复制EFDemoMergeSQL Server用户
  18. exec sp_grant_publication_access @publication = N'EFDemoMerge', @login = N'domain\scott'
  19. GO
  20. exec sp_grant_publication_access @publication = N'EFDemoMerge', @login = N'Distribution'
  21. GO
  22.  
  23. -- 添加合并复制EFDemoMergeArticle(选取数据库EFDemo中要复制的表、存储过程等,当运行发布端快照代理Sql agent job:"EFDemoMergePublicationJob"后,合并复制会在下面选取的表中创建触发器、约束、RowGuid列等)
  24. use [EFDemo]
  25. exec sp_addmergearticle @publication = N'EFDemoMerge', @article = N'Book', @source_owner = N'dbo', @source_object = N'Book', @type = N'table', @description = N'', @creation_script = N'', @pre_creation_cmd = N'drop', @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 = N'', @vertical_partition = N'false', @verify_resolver_signature = 1, @allow_interactive_resolver = N'false', @fast_multicol_updateproc = N'true', @check_permissions = 0, @subscriber_upload_options = 0, @delete_tracking = N'true', @compensate_for_errors = N'false', @stream_blob_columns = N'true', @partition_options = 0
  26. GO
  27. use [EFDemo]
  28. exec sp_addmergearticle @publication = N'EFDemoMerge', @article = N'Cars', @source_owner = N'MD', @source_object = N'Cars', @type = N'table', @description = N'', @creation_script = N'', @pre_creation_cmd = N'drop', @schema_option = 0x000000010C034FD1, @identityrangemanagementoption = N'auto', @pub_identity_range = 10000, @identity_range = 1000, @threshold = 80, @destination_owner = N'MD', @force_reinit_subscription = 1, @column_tracking = N'false', @subset_filterclause = N'', @vertical_partition = N'false', @verify_resolver_signature = 1, @allow_interactive_resolver = N'false', @fast_multicol_updateproc = N'true', @check_permissions = 0, @subscriber_upload_options = 0, @delete_tracking = N'true', @compensate_for_errors = N'false', @stream_blob_columns = N'true', @partition_options = 0
  29. GO
  30. use [EFDemo]
  31. exec sp_addmergearticle @publication = N'EFDemoMerge', @article = N'Person', @source_owner = N'dbo', @source_object = N'Person', @type = N'table', @description = N'', @creation_script = N'', @pre_creation_cmd = N'drop', @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 = N'', @vertical_partition = N'false', @verify_resolver_signature = 1, @allow_interactive_resolver = N'false', @fast_multicol_updateproc = N'true', @check_permissions = 0, @subscriber_upload_options = 0, @delete_tracking = N'true', @compensate_for_errors = N'false', @stream_blob_columns = N'true', @partition_options = 0
  32. GO
  33. use [EFDemo]
  34. exec sp_addmergearticle @publication = N'EFDemoMerge', @article = N'Product', @source_owner = N'dbo', @source_object = N'Product', @type = N'table', @description = N'', @creation_script = N'', @pre_creation_cmd = N'drop', @schema_option = 0x000000010C034FD1, @identityrangemanagementoption = N'none', @destination_owner = N'dbo', @force_reinit_subscription = 1, @column_tracking = N'false', @subset_filterclause = N'', @vertical_partition = N'false', @verify_resolver_signature = 1, @allow_interactive_resolver = N'false', @fast_multicol_updateproc = N'true', @check_permissions = 0, @subscriber_upload_options = 0, @delete_tracking = N'true', @compensate_for_errors = N'false', @stream_blob_columns = N'true', @partition_options = 0
  35. GO
  36.  
  37. -- 添加合并复制的订阅端
  38. use [EFDemo]
  39. exec sp_addmergesubscription @publication = N'EFDemoMerge', @subscriber = N'DB_Server_001', @subscriber_db = N'EFDemoSubscription', @subscription_type = N'Push', @sync_type = N'Automatic', @subscriber_type = N'Global', @subscription_priority = 75, @description = N'', @use_interactive_resolver = N'False'
  40. GO
  41.  
  42. -- 将前面创建的订阅端数据同步Sql agent job:"EFDemoMergeSubscriptionJob"分配给合并复制的订阅端
  43. -- 注意@subscriber_login, @subscriber_password 两个参数是订阅端数据库的管理员用户名和密码
  44. exec sp_addmergepushsubscription_agent @job_name=N'EFDemoMergeSubscriptionJob', @publication = N'EFDemoMerge', @subscriber = N'DB_Server_001', @subscriber_db = N'EFDemoSubscription', @job_login = null, @job_password = null, @subscriber_security_mode = 0, @subscriber_login = N'Distribution', @subscriber_password = N'1qaz!QAZ', @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 = 235959, @active_start_date = 0, @active_end_date = 0
  45. GO

这样我们就用SQL脚本创建了合并复制的发布端和订阅端。

也可以用下面的SQL脚本来删除合并复制的发布端和订阅端。

  1. -- sp_dropmergesubscription,先删除合并复制的所有订阅端,注意这个存储过程并不会清除每个订阅端数据库中的合并复制对象(合并复制自动创建的系统表、触发器、约束、表中的RowGuid列等)
  2. use [EFDemo]
  3. exec sp_dropmergesubscription @publication = N'EFDemoMerge', @subscriber = N'DB_Server_001', @subscriber_db = N'EFDemoSubscription'
  4. GO
  5.  
  6. -- sp_dropmergearticle,删除合并复制中发布端所有Article(发布端数据库中复制的所有表、存储过程等对象)
  7. use [EFDemo]
  8. exec sp_dropmergearticle @publication = N'EFDemoMerge', @article = N'Book', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
  9. GO
  10. use [EFDemo]
  11. exec sp_dropmergearticle @publication = N'EFDemoMerge', @article = N'Cars', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
  12. GO
  13. use [EFDemo]
  14. exec sp_dropmergearticle @publication = N'EFDemoMerge', @article = N'House', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
  15. GO
  16. use [EFDemo]
  17. exec sp_dropmergearticle @publication = N'EFDemoMerge', @article = N'Person', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
  18. GO
  19. use [EFDemo]
  20. exec sp_dropmergearticle @publication = N'EFDemoMerge', @article = N'Product', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
  21. GO
  22.  
  23. -- 再用sp_dropmergepublication,删除合并复制的发布端,要先调用sp_dropmergesubscription将合并复制的订阅端删除完后,才能成功调用这个存储过程,否则会报错
  24. use [EFDemo]
  25. exec sp_dropmergepublication @publication = N'EFDemoMerge'
  26. GO
  27.  
  28. -- 最后记得用sp_removedbreplication,来清除每个订阅端数据库中的合并复制对象(合并复制自动创建的系统表、触发器、约束、表中的RowGuid列等)
  29. -- 很奇怪不知道为啥上面的sp_dropmergesubscription不会删除订阅端数据库中的合并复制对象
  30. USE master
  31. EXEC sp_removedbreplication @dbname='EFDemoSubscription'
  32. GO

当然上面这些脚本也可以在SQL Server Management Studio中自动生成出来,不用自己去写。

使用SQL脚本创建带分区的合并复制

带分区的合并复制只能用存储过程来创建,首先通过如下存储过程,用发布端数据库EFDemo来创建合并复制EFDemoMerge:

  1. -- 添加合并复制功能(合并复制自动创建的系统表)到发布端数据库EFDemo
  2. use master
  3. exec sp_replicationdboption @dbname = N'EFDemo', @optname = N'merge publish', @value = N'true'
  4. GO
  5.  
  6. -- 添加合并复制EFDemoMerge,即发布端
  7. use [EFDemo]
  8. exec sp_addmergepublication
  9. @publication = N'EFDemoMerge',
  10. @description = N'Merge publication of database ''EFDemo'' from Publisher ''DB_Server_001''.',
  11. @sync_mode = N'native',
  12. @retention = 14,
  13. @allow_push = N'true',
  14. @allow_pull = N'true',
  15. @allow_anonymous = N'true',
  16. @enabled_for_internet = N'false',
  17. @snapshot_in_defaultfolder = N'true',
  18. @compress_snapshot = N'false',
  19. @ftp_port = 21,
  20. @ftp_subdirectory = N'ftp',
  21. @ftp_login = N'anonymous',
  22. @allow_subscription_copy = N'false',
  23. @add_to_active_directory = N'false',
  24. @dynamic_filters = N'true',
  25. @conflict_retention = 14,
  26. @keep_partition_changes = N'true',
  27. @allow_synctoalternate = N'false',
  28. @max_concurrent_merge = 0,
  29. @max_concurrent_dynamic_snapshots = 0,
  30. @use_partition_groups = N'true',
  31. @publication_compatibility_level = N'100RTM',
  32. @replicate_ddl = 1,
  33. @allow_subscriber_initiated_snapshot = N'false',
  34. @allow_web_synchronization = N'false',
  35. @allow_partition_realignment = N'true',
  36. @retention_period_unit = N'days',
  37. @conflict_logging = N'both',
  38. @automatic_reinitialization_policy = 0
  39. GO

其中有四个参数黄色高亮标记了出来是开启分区合并复制的关键:

  • @dynamic_filters = N'true'   分区合并复制必须使用动态函数(HOST_NAME()就是动态函数),所以要开启动态筛选
  • @keep_partition_changes = N'true'
  • @use_partition_groups = N'true'
  • @allow_partition_realignment = N'true'

然后将发布端快照代理Sql agent job:"EFDemoMergePublicationJob"分配给合并复制的发布端,这个没什么特别的:

  1. -- 将前面创建的发布端快照代理Sql agent job:"EFDemoMergePublicationJob"分配给合并复制的发布端
  2. -- 注意@publisher_login , @publisher_password 两个参数是发布端数据库的管理员用户名和密码
  3. exec sp_addpublication_snapshot @snapshot_job_name=N'EFDemoMergePublicationJob', @publication = N'EFDemoMerge', @frequency_type = 4, @frequency_interval = 14, @frequency_relative_interval = 1, @frequency_recurrence_factor = 0, @frequency_subday = 1, @frequency_subday_interval = 5, @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 = 0, @publisher_login = N'Distribution', @publisher_password = N'1qaz!QAZ'
  4. exec sp_grant_publication_access @publication = N'EFDemoMerge', @login = N'sa'
  5. GO

然后在添加合并复制的Article时,至少要有一个Article对象使用了带动态函数的Filter,下面的MD.Cars表上就使用了HOST_NAME()动态函数来作为Filter:

  1. -- 添加合并复制EFDemoMergeArticle(选取数据库EFDemo中要复制的表、存储过程等,当运行发布端快照代理Sql agent job:"EFDemoMergePublicationJob"后,合并复制会在下面选取的表中创建触发器、约束、RowGuid列等)
  2. use [EFDemo]
  3. exec sp_addmergearticle
  4. @publication = N'EFDemoMerge',
  5. @article = N'Book',
  6. @source_owner = N'dbo',
  7. @source_object = N'Book',
  8. @type = N'table',
  9. @description = N'',
  10. @creation_script = N'',
  11. @pre_creation_cmd = N'drop',
  12. @schema_option = 0x000000010C034FD1,
  13. @identityrangemanagementoption = N'auto',
  14. @pub_identity_range = 10000,
  15. @identity_range = 1000,
  16. @threshold = 80,
  17. @destination_owner = N'dbo',
  18. @force_reinit_subscription = 1,
  19. @column_tracking = N'false',
  20. @subset_filterclause = N'',
  21. @vertical_partition = N'false',
  22. @verify_resolver_signature = 1,
  23. @allow_interactive_resolver = N'false',
  24. @fast_multicol_updateproc = N'true',
  25. @check_permissions = 0,
  26. @subscriber_upload_options = 0,
  27. @delete_tracking = N'true',
  28. @compensate_for_errors = N'false',
  29. @stream_blob_columns = N'true',
  30. @partition_options = 3
  31. GO
  32.  
  33. use [EFDemo]
  34. exec sp_addmergearticle
  35. @publication = N'EFDemoMerge',
  36. @article = N'Cars',
  37. @source_owner = N'MD',
  38. @source_object = N'Cars',
  39. @type = N'table',
  40. @description = N'',
  41. @creation_script = N'',
  42. @pre_creation_cmd = N'drop',
  43. @schema_option = 0x000000010C034FD1,
  44. @identityrangemanagementoption = N'auto',
  45. @pub_identity_range = 10000,
  46. @identity_range = 1000,
  47. @threshold = 80,
  48. @destination_owner = N'MD',
  49. @force_reinit_subscription = 1,
  50. @column_tracking = N'false',
  51. @subset_filterclause = N'[CarName] =HOST_NAME()',
  52. @vertical_partition = N'false',
  53. @verify_resolver_signature = 1,
  54. @allow_interactive_resolver = N'false',
  55. @fast_multicol_updateproc = N'true',
  56. @check_permissions = 0,
  57. @subscriber_upload_options = 0,
  58. @delete_tracking = N'true',
  59. @compensate_for_errors = N'false',
  60. @stream_blob_columns = N'true',
  61. @partition_options = 3
  62. GO

可以看到上面我们添加了两张表dbo.Book和MD.Cars作为合并复制的Article,黄色高亮标记处显示,我们在MD.Cars表上使用了[CarName] =HOST_NAME()来作为Filter,其中使用了动态函数HOST_NAME()

最后运行发布端快照代理Sql agent job:"EFDemoMergePublicationJob",然后我们可以看到在合并复制EFDemoMerge的属性中多了个选项叫"Data Partitions":

可以在这里添加分区,每个分区的HOST_NAME是分区的唯一标识符,也是动态函数HOST_NAME()的返回值:

当然分区还可以通过存储过程sp_addmergepartition来添加。

这里再附上几个关于分区合并复制的链接:

Snapshots for Merge Publications with Parameterized Filters

Parameterized Filters - Parameterized Row Filters

sp_addmergepartition

如何用SQL脚本在SQL Server Replication中创建合并复制,以及怎么创建分区合并复制的更多相关文章

  1. SQL Server Replication 中关于视图的点滴

    在服务器A数据库TEST新建了一个本地发布(Local Publications)RPL_GES_MIS_TEST,在服务器B数据库RPL_TEST上创建了一个本地订阅(Local Subscript ...

  2. mysql 批处理命令执行多个sql脚本

    方法1 若有SQL脚本a.sql, b.sql, 其目录在f盘根目录下, 则可再写一个SQL脚本c.sql(假设其目录也在f盘根目录下, 也可以在其他路径下)如下: source f:/a.sql; ...

  3. SQL Server 2005 中的分区表和索引

    SQL Server 2005 中的分区表和索引 SQL Server 2005          69(共 83)对本文的评价是有帮助 - 评价此主题   发布日期 : 3/24/2005 | 更新 ...

  4. PL/SQL中批量执行SQL脚本(不可把所有的语句都复制到New SQL Windows)

    PL/SQL中批量执行SQL脚本,不可把所有的语句都复制到New SQL Window,因为这样会导致缓冲区过大而进程卡死! 最好的办法是将要执行的SQL脚本存放到指定文件中,如C:\insert.s ...

  5. 查看oracle数据库下面的所有的表,执行某个sql脚本:

    查看oracle数据库下面的所有的表: select * from user_tables;//user为用户名 执行某个sql脚本: SQL>@e 文件名.sql

  6. 运用PowerDesigner的反向工程,可以导入SQL脚本,从而生成物理模型

    运用PowerDesigner的反向工程,可以导入SQL脚本,从而生成物理模型.方法/步骤 首先打开PowerDesigner,点击左上角“File”—>"Reverse Engine ...

  7. mysql中如何在命令行中,执行一个SQL脚本文件?

    需求描述: 在mysql数据库的使用中,有的时候,需要直接在shell的命令行中,执行某个SQL脚本文件, 比如,要初始化数据库,创建特定的存储过程,创建表等操作,这里进行一个基本的测试. 一般情况, ...

  8. 通过Excel表创建sql脚本

    Excel.sql脚本 1)准备好存有数据的excel表格: 这里我们有些小技巧可以让表下面和右边的表格隐藏,在第8行的位置按住“Ctrl+Shift+↓”可以选定下面的空格,然后鼠标右键 隐藏即可, ...

  9. shell脚本中执行sql脚本(mysql为例)

    1.sql脚本(t.sql) insert into test.t value ("LH",88); 2.shell脚本(a.sh     为方便说明,a.sh与t.sql在同一目 ...

随机推荐

  1. redis集群报Jedis does not support password protected Redis Cluster configurations异常解决办法

    解决spring-data-redis操作redis集群报“Jedis does not support password protected Redis Cluster configurations ...

  2. 前端组件化Polymer入门教程(5)——生命周期

    以前我对生命周期这个概念还真不是很清楚,不过想想也简单,比如说人的生命周期,无非就是生老病死.而对于程序的生命周期就是说,它在每个阶段都会做不同的事,再比如说回调函数把,ajax返回的时候它才执行,那 ...

  3. [Python]可变类型,默认参数与学弟的困惑

    一.学弟的困惑 十天前一个夜阑人静.月明星稀的夜晚,我和我的朋友们正在学校东门的小餐馆里吃着方圆3里内最美味的牛蛙,唱着最好听的歌儿,畅聊人生的意义.突然,我的手机一震,气氛瞬间就安静下来,看着牛蛙碗 ...

  4. Ant Trip(区别于二分匹配中最小路径覆盖的一笔画问题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3018 题目: Problem Description Ant Country consist of ...

  5. PHP初级程序员出路

    分销系统 微信公众号开发 分销系统 微信小程序

  6. Docker基础-端口映射与容器互联

    1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时, ...

  7. vue项目webpack打包后图片路径错误

    首先项目是vue-cli搭建的,项目结构如下: 然后发现在css里写的图片引用地址在开发时正常显示,但在打包扔上服务器之后报错 报的是404,路径前面多了/static/css,不知道为啥. 在自己慢 ...

  8. [android] WebView与Js交互

    获取WebView对象 调用WebView对象的getSettings()方法,获取WebSettings对象 调用WebSettings对象的setJavaScriptEnabled()方法,设置j ...

  9. Shiro遇到的SecurityManager红色警告

    问题如图 需要添加一个导入 import org.apache.shiro.mgt.SecurityManager; 这样就不会报错了

  10. Java多线程--基础概念

    Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...