如何创建发布(复制 Transact-SQL 编程)

可以使用复制存储过程以编程的方式创建发布。 使用的存储过程将取决于要创建的发布的类型。

安全说明安全说明

请尽可能使用 Windows 身份验证。 如果可能,请在运行时提示用户输入安全凭据。 如果必须在脚本文件中存储凭据,则必须保护文件以防止未经授权的访问。

创建快照发布或事务发布

  1. 在发布服务器上,对发布数据库执行 sp_replicationdboption (Transact-SQL) 以启用使用快照复制或事务复制的当前数据库的发布。

  2. 对于事务发布,确定发布数据库中是否存在日志读取器代理作业。 (对于快照发布,不需要此步骤)。

    • 如果发布数据库中存在日志读取器代理作业,则继续执行步骤 3。

    • 如果您不确定发布的数据库中是否存在日志读取器代理作业,请在发布服务器上,对发布数据库执行 sp_helplogreader_agent (Transact-SQL)

    • 如果结果集为空,则创建日志读取器代理作业。 在发布服务器上,执行 sp_addlogreader_agent (Transact-SQL)。 为 @job_name@password 指定代理运行时所用的 Microsoft Windows 凭据。 如果代理连接到发布服务器时使用 SQL Server 身份验证,则还必须将 @publisher_security_mode 的值指定为 0,并为 @publisher_login@publisher_password 指定 Microsoft SQL Server 登录信息。 继续执行步骤 3。

  3. 在发布服务器上,执行 sp_addpublication (Transact-SQL)。 为 @publication 指定发布名称,并且对于 @repl_freq 参数,为快照发布指定 snapshot 值或为事务发布指定 continuous 值。 指定任何其他发布选项。 这便定义了发布。

    注意注意

    发布名称不能包括下列字符:

    % * [ ] | : " ? \ / < >

  4. 在发布服务器上,执行 sp_addpublication_snapshot (Transact-SQL)。 为 @publication 指定步骤 3 中使用的发布名称,并为 @snapshot_job_name@password 指定快照代理运行时所用的 Windows 凭据。 如果代理连接到发布服务器时使用 SQL Server 身份验证,则还必须将 @publisher_security_mode 的值指定为 0,并为 @publisher_login@publisher_password 指定 SQL Server 登录信息。 此操作将为发布创建一个快照代理作业。

    安全说明安全说明

     使用远程分发服务器配置发布服务器时,为所有参数提供的值(包括 job_login 和 job_password)都会以纯文本方式发送到该分发服务器。 在执行此存储过程之前,应该对发布服务器及其远程分发服务器之间的连接进行加密。 有关详细信息,请参阅加密与 SQL Server 的连接

  5. 向发布添加项目。 有关详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

  6. 启动快照代理作业以为此发布生成初始快照。 有关详细信息,请参阅如何创建初始快照(复制 Transact-SQL 编程)

创建合并发布

  1. 在发布服务器上,执行 sp_replicationdboption (Transact-SQL) 以启用使用合并复制的当前数据库的发布。

  2. 在发布服务器上,对发布数据库执行 sp_addmergepublication (Transact-SQL)。 为 @publication 指定发布的名称,并指定任何其他发布选项。 这便定义了发布。

    注意注意

    发布名称不能包括下列字符:

    % * [ ] | : " ? \ / < >

  3. 在发布服务器上,执行 sp_addpublication_snapshot (Transact-SQL)。 为 @publication 指定步骤 2 中使用的发布名称,并为 @snapshot_job_name@password 指定快照代理运行时所用的 Windows 凭据。 如果代理连接到发布服务器时使用 SQL Server 身份验证,则还必须将 @publisher_security_mode 的值指定为 0,并为 @publisher_login@publisher_password 指定 SQL Server 登录信息。 此操作将为发布创建一个快照代理作业。

    安全说明安全说明

     使用远程分发服务器配置发布服务器时,为所有参数提供的值(包括 job_login 和 job_password)都会以纯文本方式发送到该分发服务器。 在执行此存储过程之前,应该对发布服务器及其远程分发服务器之间的连接进行加密。 有关详细信息,请参阅加密与 SQL Server 的连接

  4. 向发布添加项目。 有关详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

  5. 启动快照代理作业以为此发布生成初始快照。 有关详细信息,请参阅如何创建初始快照(复制 Transact-SQL 编程)

示例

此示例创建事务发布。 脚本变量用于传递创建快照代理和日志读取器代理作业时所需的 Windows 凭据。

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2008R2'; 
SET @publication = N'AdvWorksProductTran'; 
-- Windows account used to run the Log Reader and Snapshot Agents.
SET @login = $(Login); 
-- This should be passed at runtime.
SET @password = $(Password); 

-- Enable transactional or snapshot replication on the publication database.
EXEC sp_replicationdboption 
    @dbname=@publicationDB, 
    @optname=N'publish',
    @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
    @job_login = @login, 
    @job_password = @password,
    -- Explicitly specify the use of Windows Integrated Authentication (default) 
    -- when connecting to the Publisher.
    @publisher_security_mode = 1;

-- Create a new transactional publication with the required properties. 
EXEC sp_addpublication 
    @publication = @publication, 
    @status = N'active',
    @allow_push = N'true',
    @allow_pull = N'true',
    @independent_agent = N'true';

-- Create a new snapshot job for the publication, using a default schedule.
EXEC sp_addpublication_snapshot 
    @publication = @publication, 
    @job_login = @login, 
    @job_password = @password,
    -- Explicitly specify the use of Windows Integrated Authentication (default) 
    -- when connecting to the Publisher.
    @publisher_security_mode = 1;
GO

此示例创建合并发布。 脚本变量用于传递创建快照代理作业时所需的 Windows 凭据。

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Declarations for adding a merge publication
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2008R2'; 
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @login = $(Login);
SET @password = $(Password);

-- Enable merge replication on the publication database, using defaults.
USE master
EXEC sp_replicationdboption 
  @dbname=@publicationDB, 
  @optname=N'merge publish',
  @value = N'true' 

-- Create a new merge publication, explicitly setting the defaults. 
USE [AdventureWorks2008R2]
EXEC sp_addmergepublication 
-- These parameters are optional.
  @publication = @publication,
  -- optional parameters 
  @description = N'Merge publication of AdventureWorks2008R2.',
  @publication_compatibility_level  = N'90RTM';

-- Create a new snapshot job for the publication.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = @login, 
  @job_password = @password;
GO