使用脚本发布订阅

http://blog.csdn.net/kk185800961/article/details/44719685

建使用本地分发服务器】

  1. /************************【使用本地分发服务器配置发布】***********************/    
  2. --  SqlServer 2008 R2    
  3. --  https://technet.microsoft.com/zh-cn/library/ms151860(v=sql.105).aspx    
  4. use master    
  5. go    
  6.     
  7. --  服务器上是否已安装分发服务器    
  8. --  https://msdn.microsoft.com/zh-cn/library/ms190339(v=sql.105).aspx    
  9. exec master.dbo.sp_get_distributor    
  10. go    
  11.     
  12. --  配置分发服务器    
  13. --  https://msdn.microsoft.com/zh-cn/library/ms176028(v=sql.105).aspx    
  14. exec master.dbo.sp_adddistributor     
  15.  @distributor = 'KK-PC'    --分发服务器名称    
  16. ,@heartbeat_interval = 10       --代理在不记录进度消息的情况下可以运行的最长分钟数    
  17. ,@password = N'123456'  --分发服务器密码    
  18. go    
  19.     
  20. --  配置分发数据库    
  21. --  https://msdn.microsoft.com/zh-cn/library/ms189755(v=sql.105).aspx    
  22. exec master.dbo.sp_adddistributiondb     
  23.  @database = N'distribution'    --要创建的分发数据库的名称    
  24. ,@data_folder = N'E:TempFileDistribution' --分发数据库数据文件的目录    
  25. ,@data_file = N'distribution'   --数据库文件的名称    
  26. ,@data_file_size = 5            --初始数据文件大小,以兆字节 (MB) 为单位    
  27. ,@log_folder = N'E:TempFileDistribution' ----分发数据库日志文件的目录    
  28. ,@log_file = N'distribution_log'     
  29. ,@log_file_size =  5            --初始日志文件大小,以兆字节 (MB) 为单位     
  30. ,@min_distretention = 0         --从分发数据库中删除事务前的最小保持期,以小时为单位    
  31. ,@max_distretention = 72        --删除事务前的最大保持期,以小时为单位     
  32. ,@history_retention = 48        --历史记录的保留时间,以小时为单位     
  33. ,@security_mode = 1             --同步时连接到分发服务器的安全模式。默认值为1:Windows验证,0: SQL验证     
  34. ,@login = N'KK-PCSqlReplicator'     
  35. ,@password = N'123456'     
  36. ,@createmode = 1                --1:创建或使用现有数据库(instdist.sql)     
  37. go    
  38.     
  39. --  配置发布服务器以使用指定的分发数据库    
  40. --  https://msdn.microsoft.com/zh-cn/library/ms173807(v=sql.105).aspx    
  41. exec master.dbo.sp_adddistpublisher     
  42.  @publisher = N'KK-PC'         --发布服务器的名称    
  43. ,@distribution_db = N'distribution' --分发数据库的名称     
  44. ,@security_mode = 1                 --安全模式,默认1:Windows验证,0: SQL验证     
  45. ,@login = N'KK-PCSqlReplicator'     
  46. ,@password = N'123456'     
  47. ,@working_directory = N'E:TempFileReplData'--默认快照文件夹的UNC共享目录    
  48. ,@thirdparty_flag  = 0              --发布服务器是否是SQLServer,默认0:是,1:否    
  49. ,@publisher_type  = N'MSSQLSERVER'  --发布服务器类型:MSSQLSERVER(默认)/ORACLE/ORACLE GATEWAY    
  50. go    
  51.     
  52. /*****配置完成!!*****/    


  1. /*****【查看分发属性】******/  
  2.   
  3. --  检查分发数据库目录  
  4. exec master.dbo.xp_subdirs N'E:TempFileDistribution'  
  5.   
  6. --  发布服务器的属性(在分发服务器任何数据库执行)  
  7. --  https://technet.microsoft.com/zh-cn/library/ms190323(v=sql.105).aspx  
  8. exec master.dbo.sp_helpdistpublisher N'KK-PC'  
  9.   
  10. --  分发数据库的属性(在分发服务器的分发数据库上执行)  
  11. --  https://msdn.microsoft.com/zh-cn/library/vstudio/aa238917.aspx  
  12. exec master.dbo.sp_helpdistributiondb N'distribution'  
  13.   
  14. --  列出有关分发服务器相关信息(在分发服务器任何数据库执行)  
  15. --  https://msdn.microsoft.com/zh-cn/library/ms177504(v=sql.105).aspx  
  16. exec master.dbo.sp_helpdistributor  



  1. /*****【删除分发】******/  
  2. --这里不必执行!  
  3.   
  4.   
  5. --  删除分发发布服务器(在分发服务器任何数据库执行)  
  6. --  https://technet.microsoft.com/zh-cn/library/ms188411(v=sql.105).aspx  
  7. exec master.dbo.sp_dropdistpublisher @publisher =  N'KK-PC',@no_checks = 0,@ignore_distributor = 0 --检查对象;连接分发;  
  8.   
  9. --  删除分发数据库(在分发服务器任何数据库执行)  
  10. --  https://msdn.microsoft.com/zh-cn/library/ms188355(v=sql.105).aspx  
  11. exec master.dbo.sp_dropdistributiondb N'distribution';  
  12.   
  13. --  卸载分发服务器(除分发数据库之外的任何数据库中执行)  
  14. --  https://technet.microsoft.com/zh-cn/library/ms173516(v=sql.105).aspx  
  15. exec master.dbo.sp_dropdistributor @no_checks = 0,@ignore_distributor = 0 --检查对象;连接分发;  






【创建可更新订阅的事务发布】


  1. /*************************************【创建发布】**************************************/  
  2. /*【实例:可更新订阅】  
  3.   
  4. * A 为发布数据库,id为每个表的主键  
  5. * B,C 为订阅数据库  
  6. * A中符合条件 [id % 2 = 0] 的同步到B中  
  7. * A中符合条件 [id % 2 = 1] 的同步到C中  
  8. * 以下以 B 创建发布订阅  
  9.       
  10.   当前发布数据库:[mytest]  
  11.   当前订阅数据库:[mytestA]  
  12.     
  13.     
  14. */  
  15.   
  16.   
  17.   
  18. --  作为发布的数据库  
  19. use [mytest]  
  20.   
  21. --  设置指定数据库的复制数据库选项(发布服务器或订阅服务器执行)  
  22. --  http://msdn.microsoft.com/zh-cn/library/ms188769.aspx  
  23. exec sys.sp_replicationdboption @dbname = N'mytest', @optname = N'publish', @value = N'true'  
  24. go  
  25.   
  26.   
  27. --  为给定分发服务器添加队列读取器代理(在分发库或发布库执行)(每个实例默认只1个,已存在可不须再执行)  
  28. --  http://msdn.microsoft.com/ZH-CN/LIBRARY/ms189517  
  29. exec sys.sp_addqreader_agent @job_login = N'KK-PCSqlReplicator', @job_password = N'123456', @job_name = null, @frompublisher = 1  
  30. go  
  31.   
  32.   
  33. --  为给定数据库添加日志读取器代理(在发布数据库执行)(每个数据库默认只1个,已存在可不须再执行)  
  34. --  http://technet.microsoft.com/zh-cn/library/ms189516.aspx  
  35. exec sys.sp_helplogreader_agent @publisher = null --查看当前数据库存在的日志代理  
  36. exec sys.sp_addlogreader_agent @job_login = N'KK-PCSqlReplicator', @job_password = N'123456', @publisher_security_mode = 1, @job_name = null  
  37. go  
  38.   
  39.   
  40. /***************************【创建发布:以下用于1库多发布】******************************/  
  41.   
  42. --  添加(可更新订阅)事务发布(在发布数据库执行)  
  43. --  http://msdn.microsoft.com/zh-cn/library/ms188738(v=sql.100).aspx  
  44. exec sys.sp_addpublication   
  45. @publication = N'tran_repl',        --【指定发布名称】  
  46. @description = N'来自发布服务器“”的数据库“mytest”的具有可更新订阅的事务发布。',   
  47. @sync_method = N'concurrent',           --同步模式:本机模式大容量复制程序输出  
  48. @retention = 0,                         --订阅活动的保持期(小时):默认值为336小时;0:订阅永不过期  
  49. @allow_push = N'true',                  --推送订阅   
  50. @allow_pull = N'true',                  --允许创建请求订阅  
  51. @allow_anonymous = N'false',            --不可创建匿名订阅   
  52. @enabled_for_internet = N'false',       --非Internet发布  
  53. @snapshot_in_defaultfolder = N'false',  --不指定快照默认文件夹,须设置@alt_snapshot_folder  
  54. @alt_snapshot_folder = N'E:TempFileReplData', --指定快照的备用文件夹的位置  
  55. @compress_snapshot = N'false',          --不压缩快照  
  56. @ftp_port = 21,                         --默认分发服务器的FTP服务的端口号:21  
  57. @ftp_login = N'anonymous',              --默认用于连接到 FTP 服务的用户名:anonymous  
  58. @allow_subscription_copy = N'false',    --禁用复制订阅此发布的订阅数据库  
  59. @add_to_active_directory = N'false',    --(已不推荐使用)  
  60. @repl_freq = N'continuous',             --复制频率的类型:基于日志的事务的输出  
  61. @status = N'active',                    --发布数据可立即用于订阅服务器  
  62. @independent_agent = N'true',           --【独立分发代理】  
  63. @immediate_sync = N'false',             --每次运行快照代理时不为发布创建同步文件  
  64. @allow_sync_tran = N'true',             --允许使用【立即更新订阅】  
  65. @autogen_sync_procs = N'true',          --在发布服务器上生成更新订阅的【同步存储过程】  
  66. @allow_queued_tran = N'true',           --在订阅服务器中启用更改的队列  
  67. @allow_dts = N'false',                  --不允许数据转换  
  68. @conflict_policy = N'sub wins',         --排队更新订阅服务器选项时所遵从的冲突解决策略:【订阅入选】  
  69. @centralized_conflicts = N'true',       --在发布服务器上存储冲突记录  
  70. @conflict_retention = 14,               --冲突保持期(天)  
  71. @queue_type = N'sql',                   --使用的队列类型:默认SQL Server存储事务  
  72. @replicate_ddl = 1,                     --【支持架构复制】  
  73. @allow_initialize_from_backup = N'false', --不允许用备份初始化订阅  
  74. @enabled_for_p2p = N'false',            --非对等复制  
  75. @enabled_for_het_sub = N'false'         --只支持SQL Server订阅服务器  
  76. go  
  77.   
  78.   
  79. --  为指定的发布创建快照代理(在发布数据库执行)  
  80. --  http://msdn.microsoft.com/zh-cn/library/ms174958(v=sql.100)  
  81. exec sys.sp_addpublication_snapshot   
  82. @publication = N'tran_repl',  
  83. @frequency_type = 1,  
  84. @frequency_interval = 0,  
  85. @frequency_relative_interval = 0,  
  86. @frequency_recurrence_factor = 0,  
  87. @frequency_subday = 0,   
  88. @frequency_subday_interval = 0,   
  89. @active_start_time_of_day = 0,   
  90. @active_end_time_of_day = 235959,   
  91. @active_start_date = 0,   
  92. @active_end_date = 0,   
  93. @job_login = N'KK-PCSqlReplicator',   
  94. @job_password = N'123456',   
  95. @publisher_security_mode = 1  
  96. go  
  97.   
  98.   
  99. --  更改发布属性  
  100. --  https://msdn.microsoft.com/zh-cn/library/ms188413(v=sql.105).aspx  
  101. --  exec sys.sp_changepublication ……  



  1. --  创建项目并将其添加到发布中(在发布数据库执行)  
  2. --  http://msdn.microsoft.com/zh-cn/library/ms173857  
  3.   
  4. /*1. 添加可筛选的表(默认架构dbo)*/  
  5. declare @tableName          nvarchar(100)  
  6. declare @publName           nvarchar(100)  
  7. declare @mark               bit         -- 区分是否有sid的列,有则进行筛选  
  8. declare @filterNum          nvarchar(10)-- 一个数据库多个发布加编号区别  
  9. declare @filterClause       nvarchar(100)  
  10. declare @SQLaddarticle      nvarchar(max)  
  11. declare @SQLarticlefilter   nvarchar(max)  
  12. declare @SQLarticleview     nvarchar(max)  
  13. set @publName = N'tran_repl' -- 【指定发布名称】  
  14. set @filterClause = N'dbo.f_SIDTOInt(SID) % 2 = 0' --   【指定行筛选】  
  15. select @filterNum = CONVERT(NVARCHAR(10),count(*)) from distribution.dbo.MSpublications  
  16. declare cur_addTable cursor local fast_forward  
  17. for   
  18.     /*有主键 并且 有SID列(用于筛选)*/  
  19.     select name,1 mark from sys.tables t1(nolock) where is_ms_shipped = 0  
  20.     and exists(select 1 from sys.columns t2(nolock) where t1.object_id=t2.object_id and t2.name='SID')  
  21.     and name in(select table_name from information_schema.key_column_usage(nolock)   
  22.         where objectproperty(object_id(constraint_name),'isprimarykey')=1 )  
  23.     union all  
  24.     /*有主键 并且 无SID列(不可筛选)*/  
  25.     select name,0 mark from sys.tables t1(nolock) where is_ms_shipped = 0  
  26.     and not exists(select 1 from sys.columns t2(nolock) where t1.object_id=t2.object_id and t2.name='SID')  
  27.     and name in(select table_name from information_schema.key_column_usage (nolock)  
  28.         where objectproperty(object_id(constraint_name),'isprimarykey')=1 )  
  29. open cur_addTable  
  30. fetch next from cur_addTable into @tableName,@mark  
  31. while @@fetch_status = 0  
  32. begin  
  33.     if ( @mark = 1 ) /*可筛选的表对象*/  
  34.     begin  
  35.         set @SQLaddarticle = N'  
  36.         exec sp_addarticle   
  37.         @publication = N'''+@publName+''',   
  38.         @article = N'''+@tableName+''',   
  39.         @source_owner = N''dbo'',   
  40.         @source_object = N'''+@tableName+''',   
  41.         @type = N''logbased'',   
  42.         @description = null,   
  43.         @creation_script = null,   
  44.         @pre_creation_cmd = N''drop'',   
  45.         @schema_option = 0x0000000008035CDF,   
  46.         @identityrangemanagementoption = N''none'',   
  47.         @destination_table = N'''+@tableName+''',   
  48.         @destination_owner = N''dbo'',   
  49.         @status = 24,  
  50.         @vertical_partition = N''false'''  
  51.         exec(@SQLaddarticle)  
  52.         /*添加项目筛选器*/  
  53.         set @SQLarticlefilter = N'   
  54.         exec sp_articlefilter   
  55.         @publication = N'''+@publName+''',   
  56.         @article = N'''+@tableName+''',   
  57.         @filter_name = N''FLTR_'+@tableName+'_'+@filterNum+'__'+rtrim(ltrim(str(@@spid)))+''',   
  58.         @filter_clause = N'''+@filterClause+''',   
  59.         @force_invalidate_snapshot = 1,   
  60.         @force_reinit_subscription = 1'  
  61.         exec(@SQLarticlefilter)  
  62.         /*添加项目同步对象*/  
  63.         set @SQLarticleview = N'  
  64.         exec sp_articleview   
  65.         @publication = N'''+@publName+''',   
  66.         @article = N'''+@tableName+''',   
  67.         @view_name = N''SYNC_'+@tableName+'_'+@filterNum+'__'+rtrim(ltrim(str(@@spid)))+''',   
  68.         @filter_clause = N'''+@filterClause+''',   
  69.         @force_invalidate_snapshot = 1,   
  70.         @force_reinit_subscription = 1'  
  71.         exec(@SQLarticleview)  
  72.         print '已筛选:'+@tableName  
  73.     end  
  74.     else if ( @mark = 0 )  
  75.     begin  
  76.         set @SQLaddarticle = N'  
  77.         exec sp_addarticle   
  78.         @publication = N'''+@publName+''',   
  79.         @article = N'''+@tableName+''',   
  80.         @source_owner = N''dbo'',   
  81.         @source_object = N'''+@tableName+''',   
  82.         @type = N''logbased'',   
  83.         @description = null,   
  84.         @creation_script = null,   
  85.         @pre_creation_cmd = N''drop'',   
  86.         @schema_option = 0x0000000008035CDF,   
  87.         @identityrangemanagementoption = N''none'',   
  88.         @destination_table = N'''+@tableName+''',   
  89.         @destination_owner = N''dbo'',   
  90.         @status = 24,  
  91.         @vertical_partition = N''false'''  
  92.         exec(@SQLaddarticle)  
  93.         print '无筛选:'+@tableName  
  94.     end  
  95.     fetch next from cur_addTable into @tableName,@mark  
  96. end  
  97. close cur_addTable  
  98. deallocate cur_addTable  




  1. /*2. 添加视图/存储过程/函数对象(默认架构dbo)*/  
  2. declare @publName       nvarchar(100)  
  3. declare @ObjectName     nvarchar(100)  
  4. declare @Type           nvarchar(30)  
  5. declare @ObjectType     nvarchar(30)  
  6. declare @SQLaddObject   nvarchar(max)  
  7. set @publName = N'tran_repl' -- 【指定发布名称】  
  8. declare cur_addObject cursor local fast_forward  
  9. for select name,type from mytest.sys.objects where type in(N'P') and is_ms_shipped = 0  
  10.     union all  
  11.     select name,type from mytest.sys.objects a where type in(N'V') and is_ms_shipped = 0  
  12.     and exists(select 1 from mytest.sys.sql_modules b where a.object_id=b.object_id and is_schema_bound = 0)  
  13.     union all  
  14.     select name,N'B' as type from mytest.sys.objects a where type in(N'V') and is_ms_shipped = 0   
  15.     and exists(select 1 from sys.sql_modules b where a.object_id=b.object_id and is_schema_bound = 1)/*架构绑定的索引视图*/  
  16.     union all  
  17.     select name,type from mytest.sys.objects where type in(N'TF',N'FN') and is_ms_shipped = 0  
  18.     order by type,name  
  19. open cur_addObject  
  20. fetch next from cur_addObject into @ObjectName,@ObjectType  
  21. while @@fetch_status = 0  
  22. begin  
  23.     SET @Type =   
  24.     (  
  25.         CASE   
  26.         WHEN @ObjectType = N'V' THEN N'view schema only'  
  27.         WHEN @ObjectType = N'B' THEN N'indexed view schema only'  
  28.         WHEN @ObjectType = N'P' THEN N'proc schema only'  
  29.         WHEN @ObjectType in(N'TF',N'FN') THEN N'func schema only'  
  30.         END  
  31.     )  
  32.     set @SQLaddObject = N'  
  33.     exec sp_addarticle   
  34.     @publication = N'''+@publName+''',   
  35.     @article = N'''+@ObjectName+''',   
  36.     @source_owner = N''dbo'',   
  37.     @source_object = N'''+@ObjectName+''',   
  38.     @type =  N'''+@Type+''',   
  39.     @description = null,   
  40.     @creation_script = null,   
  41.     @pre_creation_cmd = N''drop'',   
  42.     @schema_option = 0x0000000008000001,   
  43.     @status = 16,  
  44.     @destination_owner = N''dbo'',   
  45.     @destination_table = N'''+@ObjectName+''''  
  46.     exec(@SQLaddObject)  
  47.     print @ObjectType+ ':' + @ObjectName  
  48.     fetch next from cur_addObject into @ObjectName,@ObjectType  
  49. end  
  50. close cur_addObject  
  51. deallocate cur_addObject  



【创建订阅】

  1.           
  2. /***********************************【创建订阅】***************************************/  
  3. /*【要在发布服务器上运行的脚本】*/  
  4.   
  5. use [mytest]  
  6.   
  7. --  将订阅添加到发布并设置订阅服务器的状态  
  8. --  (警告: distribution 代理作业隐式创建,并将在 SQL Server 代理服务帐户下运行)  
  9. --  http://technet.microsoft.com/zh-cn/library/ms181702(v=sql.100).aspx  
  10. exec sys.sp_addsubscription   
  11. @publication = N'tran_repl',    --指定发布名称  
  12. @subscriber = N'KK-PC',     --订阅服务器  
  13. @destination_db = N'mytestA',--订阅数据库  
  14. @subscription_type = N'Push',       --推送订阅  
  15. @sync_type = N'automatic',          --默认,已发布表的架构和初始数据将首先传输到订阅服务器  
  16. @article = N'all',                  --发布所订阅的项目  
  17. @update_mode = N'queued failover',  --将订阅启用为排队更新订阅,并允许更改为立即更新模式  
  18. @subscriber_type = 0                --订阅服务器的类型:SQL Server订阅服务器  
  19. go  
  20.   
  21. --  添加新的预定分发代理作业,以使推送订阅与事务发布同步  
  22. --  http://msdn.microsoft.com/zh-cn/library/ms175006(v=SQL.100)  
  23. exec sys.sp_addpushsubscription_agent   
  24. @publication = N'tran_repl',    --指定发布名称  
  25. @subscriber = N'KK-PC',         --订阅服务器  
  26. @subscriber_db = N'mytestA',    --订阅数据库  
  27. @job_login = N'KK-PCSqlReplicator',   
  28. @job_password = N'123456',   
  29. @subscriber_security_mode = 1,          --Windows 身份验证  
  30. @frequency_type = 64,                   --分发代理计划的频率:自动启动(默认)  
  31. @frequency_interval = 1,   
  32. @frequency_relative_interval = 1,   
  33. @frequency_recurrence_factor = 0,   
  34. @frequency_subday = 4,   
  35. @frequency_subday_interval = 5,   
  36. @active_start_time_of_day = 0,   
  37. @active_end_time_of_day = 235959,   
  38. @active_start_date = 0,   
  39. @active_end_date = 0,   
  40. @dts_package_location = N'Distributor'  
  41. go  



  1. /*【要在订阅服务器上运行的脚本】*/  
  2.   
  3. use mytestA  
  4.   
  5. --  设置在连接到发布服务器时立即更新订阅的同步触发器所使用的配置和安全信息  
  6. --  http://msdn.microsoft.com/zh-cn/library/ms174991(v=sql.100).aspx  
  7. exec sys.sp_link_publication   
  8. @publisher = N'KK-PC',   
  9. @publisher_db = N'mytest',   
  10. @publication = N'tran_repl',   
  11. @distributor = N'KK-PC',   
  12. @security_mode = 1,     --SQL Server 身份验证或 Windows 身份验证  
  13. @login = N'KK-PCSqlReplicator',   
  14. @password = N'123456'  
  15. go  




【启动快照并初始化】

  1. /**********************************【启动快照并初始化】**************************************/  
  2. --  发布服务器发布数据  
  3. use [mytest]  
  4.   
  5. --  对其请求订阅中的新项目的订阅添加到发布中(在发布服务器的发布数据库中执行)  
  6. --  https://technet.microsoft.com/zh-cn/library/ms181680(v=sql.100).aspx  
  7. --  exec sys.sp_refreshsubscriptions @publication = N'tran_repl'  
  8.   
  9.   
  10. --  将订阅标记为要重新初始化  
  11. --  https://msdn.microsoft.com/zh-cn/library/ms189469(v=sql.100).aspx  
  12. exec sys.sp_reinitsubscription   
  13. @publication = N'tran_repl',   
  14. @subscriber = N'KK-PC',   
  15. @destination_db = N'mytestA',   
  16. @article = N'all'  
  17. go  
  18.   
  19. --  启动可为发布生成初始快照的快照代理作业(在发布服务器的发布数据库中执行)  
  20. --  http://msdn.microsoft.com/zh-cn/library/ms176026(v=sql.105).aspx  
  21. exec sys.sp_startpublication_snapshot @publication = N'tran_repl'  
  22. go  
  23.   
  24. --  为所有表项目编写自定义 sp_MSins、sp_MSupd 和 sp_MSdel 过程的脚本  
  25. --  https://msdn.microsoft.com/zh-cn/library/ms187946(SQL.100).aspx  
  26. --exec sys.sp_scriptpublicationcustomprocs 'tran_repl'  
  27. --go  
  28.   
  29.   
  30. --  至此,完成发布订阅!!!~ 初始化完成!!~  






之前测试了N遍!!!~~今晚有空终于成功处理了!~

原文地址:https://www.cnblogs.com/ifreesoft/p/7930840.html