事务复制推送订阅发布脚本

--============================================
-- 在发布服务器执行
--============================================

-- ========================================
-- 1. 标记分发服务器
--use master
--go

--EXEC sp_adddistributor
--    @distributor = @@SERVERNAME  ,        -- 分发服务器名称 N'HOUYAJUN'
--    @password = N''                        -- distributor_admin 登录名的密码

-- ========================================
-- 2. 将数据库标记为发布数据库

use Trans
GO
DECLARE @db_name sysname
SELECT @db_name = DB_NAME()

exec sp_replicationdboption 
    @dbname = @db_name ,                    -- N'UpTrans', 
    @optname = N'publish',                    --merge publish: 数据库可用于合并发布。
                                            --publish: 数据库可用于其他类型的发布。
                                            --subscribe: 数据库为订阅数据库。
                                            --sync with backup: 启用数据库以进行协调备份。 
    @value = N'true'                        -- 启用还是禁用给定的复制数据库选项
GO

-- ========================================
-- 3. 添加事务发布
use Trans
GO
DECLARE @publication_table_name sysname,
        @publication_name sysname
SELECT --要发布的表名
    @publication_table_name = 'dbo.Trans' ,        --表名。
    -- 根据要发布的表名自动生成发布名称
    @publication_name = N'rp_' + DB_NAME()
                        + N'.' + ISNULL(PARSENAME(@publication_table_name , 2) , N'dbo')
                        + N'.' + PARSENAME(@publication_table_name ,1)
-- ========================================
-- a. 创建发布(新建的发布不包括任何项目,需要在后面的步骤中添加发布项目)
exec sp_addpublication 
    @publication = @publication_name,                -- N'Trans_Test', 
--    @description = N'来自发布服务器“HOUYAJUN”的数据库“UpTrans”的事务发布。', 
    @sync_method = N'concurrent',                    -- 同步模式(生成所有表的本机模式大容量复制程序输出)
    @retention = 0,                                    -- 订阅活动的保持期(0 订阅永不过期)
    @allow_push = N'true',                            -- 允许建立推送订阅
    @allow_pull = N'true',                            -- 允许建立请求订阅
    @allow_anonymous = N'false',                    -- 不允许建立匿名订阅
--    @enabled_for_internet = N'false',                -- 是否为 Internet 启用此发布,并确定是否可以使用文件传输协议(FTP)将快照文件传输到订阅服务器
--    @snapshot_in_defaultfolder = N'true',            -- 指定是否将快照文件存储在默认文件夹中,如果为 True,则可以在默认文件夹中找到快照文件
--    @compress_snapshot = N'false',                    -- 默认值为 FALSE。False 指定不压缩快照,而 True 指定压缩快照
--    @ftp_port = 21,                                    -- 分发服务器的 FTP 服务的端口号
--    @ftp_login = N'anonymous', 
--    @allow_subscription_copy = N'false', 
--    @add_to_active_directory = N'false', 
    @repl_freq = N'continuous',                    -- 复制频率(continuous 发布服务器提供所有基于日志的事务的输出)
    @status = N'active', 
    @independent_agent = N'true',                -- 指定该发布是否有独立分发代理
    @immediate_sync = N'false',                    
    @allow_sync_tran = N'false',                -- 指定是否允许对发布即时更新订阅
    @autogen_sync_procs = N'false', 
    @allow_queued_tran = N'false',                -- 在订阅服务器上启用或禁用更改的队列,直到可在发布服务器上应用这些更改为止
    @allow_dts = N'false', 
    @replicate_ddl = 1,                            -- 指示该发布是否支持架构复制
--    @allow_initialize_from_backup = N'false',   -- 指示订阅服务器是否能从备份而不是初始快照中初始化对此发布的订阅
    @enabled_for_p2p = N'false',                -- 是否允许将发布用于对等复制拓扑中
    @enabled_for_het_sub = N'false'                -- 是否使发布支持非 SQL Server 订阅服务器
--GO

-- b. 创建快照代理
DECLARE @active_start_date int,
        @active_start_time_of_day int 
-- 设置快照代理在建立后 10 秒钟运行一次,以便使初始化快照可用
SELECT 
    @active_start_date = CONVERT(VARCHAR(8),GETDATE() ,112) ,
    @active_start_time_of_day = REPLACE(CONVERT(VARCHAR(8) , DATEADD(Second ,10 ,getdate()) , 108) , ':' , '')

exec sp_addpublication_snapshot 
    @publication = @publication_name,                -- N'Trans_Test', 
    @publisher_security_mode = 1,                    -- 连接到发布服务器时代理使用的安全模式。
                                                    -- 0 指定采用 SQL Server 身份验证,1 指定采用 Windows 身份验证。
                                                    -- 对于非 SQL Server 发布服务器,必须将该值指定为 0。
    @job_login = null,                                -- 运行代理所用的 Windows 帐户的登录名
    @job_password = null,                            -- 运行代理时所用的 Windows 帐户的密码
    -- 以下部分定义代理执行计划
    @frequency_type = 1,                            ---    默认为4,,觉得是1好点.  执行快照代理的频率     
    @frequency_interval = 1,                        -- 是否应用到 frequency_type 所设置频率的值(1为不应用)
    @frequency_relative_interval = 1,                -- 快照代理运行的日期
    @frequency_recurrence_factor = 0,                -- frequency_type 使用的重复因子
    @active_start_date = @active_start_date,                        -- 第一次调度快照代理的日期
    @active_start_time_of_day = @active_start_time_of_day            -- 第一次调度快照代理的时间
--    @frequency_subday = 2,                            -- freq_subday_interval 的单位
--    @frequency_subday_interval = 10, 
--    @active_end_time_of_day = 235959,                -- 停止安排快照代理的时间
--    @active_end_date = 0,                            -- 停止调度快照代理的日期

-- c. 在发布中添加发布项目(表/视图/存储过程/用户定义函数)
DECLARE @schema_name sysname , 
        @object_name sysname,
        @ins_cmd nvarchar(255), 
        @del_cmd nvarchar(255),
        @upd_cmd nvarchar(255)
-- 根据发布表名自动生成添加发布需要的一些信息
SELECT  @schema_name = ISNULL(PARSENAME(@publication_table_name,2) , 'dbo') , 
        @object_name = PARSENAME(@publication_table_name ,1),
        @ins_cmd = N'CALL sp_MSins_' + @schema_name + @object_name,
        @del_cmd = N'CALL sp_MSdel_' + @schema_name + @object_name,
        @upd_cmd = N'SCALL sp_MSupd_' + @schema_name + @object_name
        
exec sp_addarticle 
    @publication = @publication_name,                    -- 项目名称  N'Trans_Test', 
    @article =    @object_name,                            -- 项目名称 N'Uptrans', 
    @source_owner =    @schema_name ,                        -- 发布对象的架构名称 N'dbo', 
    @source_object = @object_name ,                        -- 发布对象名称  N'Uptrans', 
    @type = N'logbased',                                -- 发布项目类型
--    @description = null, 
--    @creation_script = null, 
    @pre_creation_cmd = N'drop',                        -- 应用快照时, 订阅服务器存在订阅表时的处理方式(none保持已经存在的订阅表,不做处理)
    @schema_option = 0x000000000803509F,                -- 给定项目的架构生成选项的位掩码
    @identityrangemanagementoption = N'manual',            -- 指定如何处理项目的标识范围管理
    @destination_table = @object_name ,                    -- 订阅表名 N'Uptrans', 
    @destination_owner = @schema_name,                    -- 订阅表架构名称      N'dbo', 
    @vertical_partition = N'false',                        -- 启用或禁用对表项目的列筛选
    @ins_cmd = @ins_cmd,                                -- N'CALL sp_MSins_dboUptrans', 
    @del_cmd = @del_cmd,                                -- N'CALL sp_MSdel_dboUptrans', 
    @upd_cmd = @upd_cmd                                    --N'SCALL sp_MSupd_dboUptrans'
GO



--============================================
-- 4. 订阅
-- 可在推送订阅和请求订阅两种方式中任选一种
--============================================
-- 推送订阅
-- 4. 添加订阅
use Trans

DECLARE
    @publication_table_name sysname,
    @publication_name sysname,
    @subscriber_server sysname,
    @subscriber_db sysname

SELECT
    -- 要发布的表名
    @publication_table_name = N'dbo.Trans',
    -- 根据要发布的表名自动生成发布名称
    @publication_name = N'RP_' + DB_NAME() 
            + N'.' + ISNULL(PARSENAME(@publication_table_name, 2), N'dbo')
            + N'.' + PARSENAME(@publication_table_name, 1),
    @subscriber_db = N'Trans_test',                        -- 订阅数据库名称(假设与发布数据库一致) DB_NAME(),    
    @subscriber_server = N'WANGYONG-PC\TEST'            -- 订阅服务器名称

-- a. 添加订阅
exec sp_addsubscription 
    @publication = @publication_name ,                -- N'Trans_t', 
    @subscriber = @subscriber_server,                -- N'HOUYAJUN\JHIDCDBS005', 
    @destination_db = @subscriber_db,                -- N'Tran_test', 
    @subscription_type = N'Push',                    -- 订阅的类型(Push 推送订阅, Pull 请求订阅)
    @sync_type = N'automatic',                        -- 订阅同步类型(automatic 已发布表的架构和初始数据将首先传输到订阅服务器)
--    @sync_type = N'replication support only',       -- 仅在订阅服务器上生成发布项目自定义存储过程和支持更新订阅的触发器(假定订阅服务器已经具有已发布表的架构和初始数据)
    @article = N'all',                                -- 订阅的项目, all 表示订阅所有项目(包括以后在此发布中新增的项目)
    @update_mode = N'read only',                    -- 更新类型(read only 只读,订阅服务器的更新不传播到发布服务器)
    @subscriber_type = 0                            -- 订阅服务器的类型


-- b. 创建分发代理
exec sp_addpushsubscription_agent 
    @publication = @publication_name ,            -- N'Trans_t', 
    @subscriber = @subscriber_server,            -- N'HOUYAJUN\JHIDCDBS005', 
    @subscriber_db = @subscriber_db,            -- N'Tran_test', 
    @job_login = null,                            -- 连接到订阅服务器时所使用的登录名. @subscriber_security_mode 为0是,需要指定此参数及@job_password
    @job_password = null, 
    @subscriber_security_mode = 1,                -- 连接到订阅服务器所使用的安全模式(1.Windows身份验证)
    -- 以下参数定义代理执行计划
    @frequency_type = 64, 
    @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 = 20130619, 
    @active_end_date = 99991231 --, 
--    @enabled_for_syncmgr = N'False',            -- 指示是否可以通过 Microsoft 同步管理器同步订阅。
--    @dts_package_location = N'Distributor'        -- 指定包的位置
    GO

 

posted @ 2013-06-23 15:44  _cc  阅读(1015)  评论(0编辑  收藏  举报