如何配置快照属性(复制 Transact-SQL 编程)

可以使用复制存储过程以编程方式定义和修改快照属性,而使用的存储过程取决于发布的类型。

在创建快照发布或事务发布时配置快照属性

  • 在发布服务器上,执行 sp_addpublication。 为 @publication 指定发布名称,将 @repl_freq 的值指定为 snapshotcontinuous,并指定一个或多个下列与快照相关的参数:

    • @alt_snapshot_folder - 如果此发布的快照可从某位置访问,而不是或者也能从快照的默认文件夹访问,则指定相应路径。

    • @compress_snapshot - 如果备用快照文件夹内的快照文件是 Microsoft CAB 文件格式的压缩文件,则将值指定为 true

    • @pre_snapshot_script - 指定在初始快照应用之前的初始化过程中将在订阅服务器上执行的 .sql 文件的文件名和完整路径。

    • @post_snapshot_script - 指定在初始快照应用之后的初始化过程中将在订阅服务器上执行的 .sql 文件的文件名和完整路径。

    • @snapshot_in_defaultfolder - 如果快照仅在非默认位置可用,则将值指定为 false

    有关创建发布的详细信息,请参阅如何创建发布(复制 Transact-SQL 编程)

创建合并发布时配置快照属性

  1. 在发布服务器上,执行 sp_addmergepublication。 为 @publication 指定发布名称,将 @repl_freq 的值指定为 snapshotcontinuous,并指定一个或多个下列与快照相关的参数:

    • @alt_snapshot_folder - 如果此发布的快照可从某位置访问,而不是或者也能从快照的默认文件夹访问,则指定相应路径。

    • @compress_snapshot - 如果备用快照文件夹内的快照文件是 CAB 文件格式的压缩文件,则将值指定为 true

    • @pre_snapshot_script - 指定在初始快照应用之前的初始化过程中将在订阅服务器上执行的 .sql 文件的文件名和完整路径。

    • @post_snapshot_script - 指定在初始快照应用之后的初始化过程中将在订阅服务器上执行的 .sql 文件的文件名和完整路径。

    • @snapshot_in_defaultfolder - 如果快照仅在非默认位置可用,则将值指定为 false

  2. 有关创建发布的详细信息,请参阅如何创建发布(复制 Transact-SQL 编程)

修改现有快照发布或事务发布的快照属性

  1. 在发布服务器上,对发布数据库执行 sp_changepublication。 将 @force_invalidate_snapshot 的值指定为 1,并为 @property 指定下列值之一:

    • alt_snapshot_folder - 也为 @value 指定备用快照文件夹的新路径。

    • compress_snapshot - 也将 @value 的值指定为 truefalse,以指示备用快照文件夹内的快照文件是否为 CAB 文件格式的压缩文件。

    • pre_snapshot_script - 也为 @value 指定在初始快照应用之前的初始化过程中将在订阅服务器上执行的 .sql 文件的文件名和完整路径。

    • post_snapshot_script - 也为 @value 指定在初始快照应用之后的初始化过程中将在订阅服务器上执行的 .sql 文件的文件名和完整路径。

    • snapshot_in_defaultfolder - 也将值指定为 truefalse,以指示快照是否仅在非默认位置可用。

  2. (可选)在发布服务器上,对发布数据库执行 sp_changepublication_snapshot。 指定 @publication 以及将要更改的一个或多个计划或安全凭据参数。

    安全说明安全说明

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

  3. 在命令提示符处运行复制快照代理或启动快照代理作业以生成新的快照。 有关详细信息,请参阅如何创建初始快照(复制 Transact-SQL 编程)

修改现有合并发布的快照属性

  1. 在发布服务器上,对发布数据库执行 sp_changemergepublication。 将 @force_invalidate_snapshot 的值指定为 1,并为 @property 指定下列值之一:

    • alt_snapshot_folder - 也为 @value 指定备用快照文件夹的新路径。

    • compress_snapshot - 也将 @value 的值指定为 truefalse,以指示备用快照文件夹内的快照文件是否为 CAB 文件格式的压缩文件。

    • pre_snapshot_script - 也为 @value 指定在初始快照应用之前的初始化过程中将在订阅服务器上执行的 .sql 文件的文件名和完整路径。

    • post_snapshot_script - 也为 @value 指定在初始快照应用之后的初始化过程中将在订阅服务器上执行的 .sql 文件的文件名和完整路径。

    • snapshot_in_defaultfolder - 也将值指定为 truefalse,以指示快照是否仅在非默认位置可用。

  2. 在命令提示符处运行复制快照代理或启动快照代理作业以生成新的快照。 有关详细信息,请参阅如何创建初始快照(复制 Transact-SQL 编程)

示例

此示例创建一个使用备用快照文件夹和压缩快照的发布。

-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). 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 @article AS sysname;
DECLARE @owner AS sysname;
DECLARE @snapshot_share AS sysname;
SET @publicationDB = N'AdventureWorks'; 
SET @publication = N'AdvWorksSalesOrdersMergeAltSnapshot'; 
SET @article = N'SpecialOffer';
SET @owner = N'Sales';
SET @snapshot_share = '\\' + $(InstanceName) + '\AltSnapshotFolder';

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

-- Create new merge publication with an alternate snapshot location. 
USE [AdventureWorks]
EXEC sp_addmergepublication 
-- required parameters
    @publication = @publication, 
    @snapshot_in_defaultfolder = N'false',
    @alt_snapshot_folder = @snapshot_share,
    @compress_snapshot = N'true';

-- Create the snapshot job for the publication.
EXEC sp_addpublication_snapshot 
    @publication = @publication,
    @job_login = $(Login),
    @job_password = $(Password);

-- Add an article.
EXEC sp_addmergearticle 
    @publication = @publication, 
    @article = @article, 
    @source_object = @article, 
    @type = N'table', 
    @source_owner = @owner, 
    @destination_owner = @owner;

-- Start the snapshot job.
EXEC sp_startpublication_snapshot
    @publication = @publication;
GO