本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中通过 FTP 传递快照。
局限性与限制
- 快照代理必须具有指定的目录的写入权限,分发代理或合并代理必须具有读取权限。 如果使用拉取订阅,则必须将共享目录指定为通用命名约定 (UNC) 路径,例如 \\ftpserver\home\snapshots。 有关详细信息,请参阅 “保护快照文件夹”。
先决条件
- 若要使用文件传输协议(FTP)传输快照文件,必须先配置 FTP 服务器。 有关详细信息,请参阅 Microsoft Internet Information Services (IIS) 文档。
安全
为了帮助提高安全性,我们建议在通过 Internet 使用 FTP 快照传送时实现虚拟专用网络(VPN)。 有关详细信息,请参阅 使用 VPN 通过 Internet 发布数据。
最佳做法是不允许匿名登录 FTP 服务器。 快照代理必须具有指定的目录的写入权限,分发代理或合并代理必须具有读取权限。 如果使用拉取订阅,则必须将共享目录指定为通用命名约定 (UNC) 路径,例如 \\ftpserver\home\snapshots。 有关详细信息,请参阅 “保护快照文件夹”。
如果可能,请提示用户在运行时输入其凭据。 如果将凭据存储在脚本文件中,则必须保护该文件。
使用 SQL Server Management Studio
配置 FTP 服务器后,请在“ 发布属性 <发布> ”对话框中为此服务器指定目录和安全信息。 有关访问此对话框的详细信息,请参阅 “查看和修改发布属性”。
指定 FTP 信息
- 在“ 发布属性 - <发布> ”对话框中,选择 “允许订阅服务器从以下页面之一使用 FTP 下载快照文件 :
- FTP 快照页,适用于快照发布、事务性发布,以及针对运行 Microsoft SQL Server 2005 之前版本的发布服务器的合并发布。
- 用于运行 SQL Server 2005 或更高版本的发布服务器的合并发布的 FTP 快照和 Internet 页。
- 指定 FTP 服务器名称、 端口号、 FTP 根文件夹的路径、 登录名和 密码的值。
例如,如果 FTP 服务器根为 \\ftpserver\home,并且您希望快照存储在 \\ftpserver\home\snapshots,请为 FTP 根文件夹中的属性路径 指定 \snapshots\ftp(复制在创建快照文件时将“ftp”追加到快照文件夹路径)。 - 指定快照代理应将快照文件写入步骤 2 中指定的目录。 例如,若要让快照代理将快照文件写入 \\ftpserver\home\snapshots\ftp,必须在以下两个位置之一中指定路径 \\ftpserver\home\snapshots:
- 与此发布关联的分发服务器的默认快照位置。
有关指定默认快照位置的详细信息,请参阅 “指定默认快照位置”。 - 此发布的备用快照文件夹位置。 如果快照被压缩,则需要一个备用位置。
在“发布属性 - <发布>”对话框的快照页面中,在“在以下文件夹中放置文件”文本框中输入路径。
- 与此发布关联的分发服务器的默认快照位置。
- 单击 “确定” 。
使用 Transact-SQL
可以设置 FTP 服务器上可用的快照文件的选项,并且可以使用复制存储过程以编程方式修改这些 FTP 设置。 使用的过程取决于发布的类型。 FTP 快照传送仅用于请求订阅。
为快照或事务发布启用 FTP 快照传送
在发布者的发布数据库中,执行 sp_addpublication。 指定@publication,为@enabled_for_internet指定一个值
true,以及以下参数的相应值:- @ftp_address - 用于传送快照的 FTP 服务器的地址。
- (可选) @ftp_port - FTP 服务器使用的端口。
- (可选) @ftp_subdirectory - 分配给 FTP 登录名的默认 FTP 目录的子目录。 例如,如果 FTP 服务器根目录为 \\ftpserver\home,并且希望快照存储在 \\ftpserver\home\snapshots,请指定 \snapshots\ftp for @ftp_subdirectory (复制在创建快照文件时将“ftp”追加到快照文件夹路径)。
- (可选) @ftp_login - 连接到 FTP 服务器时使用的登录帐户。
- (可选) @ftp_password - FTP 登录名的密码。
这会创建使用 FTP 的发布。 有关详细信息,请参阅 “创建发布”。
为合并发布启用 FTP 快照传送
在发布服务器上,对发布数据库执行 sp_addmergepublication。 请指定@publication、为@enabled_for_internet设定
true的值,以及以下参数的相应值:- @ftp_address - 用于传送快照的 FTP 服务器的地址。
- (可选) @ftp_port - FTP 服务器使用的端口。
- (可选) @ftp_subdirectory - 分配给 FTP 登录名的默认 FTP 目录的子目录。 例如,如果 FTP 服务器根目录为 \\ftpserver\home,并且希望快照存储在 \\ftpserver\home\snapshots,请指定 \snapshots\ftp for @ftp_subdirectory (复制在创建快照文件时将“ftp”追加到快照文件夹路径)。
- (可选) @ftp_login - 连接到 FTP 服务器时使用的登录帐户。
- (可选) @ftp_password - FTP 登录名的密码。
这将创建一个使用 FTP 的出版物。 有关详细信息,请参阅 “创建发布”。
创建一个使用 FTP 快照传送的快照或事务发布的拉取订阅
在订阅数据库的订阅者上,执行 sp_addpullsubscription。 指定 @publisher 和 @publication。
- 在订阅数据库的订阅服务器上,执行 sp_addpullsubscription_agent。
指定@publisher、@publisher_db、@publication,分发代理在订阅服务器上运行时所用的@job_login和@job_password的Microsoft Windows凭据,以及@use_ftp的
true值。
- 在订阅数据库的订阅服务器上,执行 sp_addpullsubscription_agent。
指定@publisher、@publisher_db、@publication,分发代理在订阅服务器上运行时所用的@job_login和@job_password的Microsoft Windows凭据,以及@use_ftp的
在发布者的发布数据库上,执行 sp_addsubscription 来注册拉取订阅。 有关详细信息,请参阅 “创建请求订阅”。
创建使用 FTP 快照传送的合并发布的请求订阅
- 在订阅数据库的订阅服务器上,执行 sp_addmergepullsubscription。 指定 @publisher 和 @publication。
- 在订阅数据库中,执行 sp_addmergepullsubscription_agent。 指定@publisher、@publisher_db、@publication、订阅服务器上分发代理运行@job_login和@job_password的 Windows 凭据,以及@use_ftp的值
true。 - 在发布者的发布数据库中,执行 sp_addmergesubscription 来注册拉取订阅。 有关详细信息,请参阅 “创建请求订阅”。
更改快照或事务发布的一个或多个 FTP 快照传送设置
在发布服务器上,对发布数据库执行 sp_changepublication。 为 @property 指定以下值之一,并为 @value指定此设置的新值:
-
ftp_address- 用于传送快照的 FTP 服务器的地址。 -
ftp_port- FTP 服务器使用的端口。 -
ftp_subdirectory- 用于 FTP 快照的默认 FTP 目录的子目录。 -
ftp_login- 用于连接到 FTP 服务器的登录名。 -
ftp_password- FTP 登录名的密码。
-
(可选)对要更改的每个 FTP 设置重复步骤 1。
(可选)若要禁用 FTP 快照传送,请在发布服务器上对发布数据库执行 sp_changepublication 。 指定@property的值为
enabled_for_internet,以及@value的值为false。
更改合并发布的 FTP 快照传送设置
在发布服务器上,对发布数据库执行 sp_changemergepublication。 为 @property 指定以下值之一,并为 @value指定此设置的新值:
-
ftp_address- 用于传送快照的 FTP 服务器的地址。 -
ftp_port- FTP 服务器使用的端口。 -
ftp_subdirectory- 用于 FTP 快照的默认 FTP 目录的子目录。 -
ftp_login- 用于连接到 FTP 服务器的登录名。 -
ftp_password- FTP 登录名的密码。
-
(可选)对要更改的每个 FTP 设置重复步骤 1。
(可选)若要禁用 FTP 快照传送,请在发布服务器上对发布数据库执行 sp_changemergepublication 。 为@property指定一个值
enabled_for_internet,并为@value指定一个值false。
示例 (Transact-SQL)
以下示例创建一个合并发布,该发布允许订阅者通过 FTP 访问快照数据。 访问 FTP 共享时,订阅服务器应使用安全的 VPN 连接。 sqlcmd 脚本变量用于提供登录名和密码值。 有关详细信息,请参阅 将 sqlcmd 与脚本变量配合使用。
-- 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 @ftp_server AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
DECLARE @ftp_login AS sysname;
DECLARE @ftp_password AS sysname;
DECLARE @ftp_directory AS sysname;
DECLARE @snapshot_folder AS sysname;
DECLARE @article AS sysname;
DECLARE @owner AS sysname;
SET @publicationDB = N'AdventureWorks';
SET @publication = N'AdvWorksSalesOfferMergeFtp';
SET @ftp_server = $(Server);
SET @login = $(Login);
SET @password = $(Password);
SET @ftp_login = $(FtpLogin);
SET @ftp_password = $(FtpPassword);
SET @ftp_directory = N'\snapshots\ftp';
-- The snapshot folder is the root FTP folder on the server
-- with the \snapshot subdirectory.
SET @snapshot_folder = $(AlternateFolder);
SET @article = N'SpecialOffer';
SET @owner = N'Sales'
-- Enable merge replication on the publication database.
USE master
EXEC sp_replicationdboption
@dbname = @publicationDB,
@optname=N'merge publish',
@value = N'true' ;
-- Create a new merge publication, enabling FTP snapshot delivery.
-- Specify the publication compatibility level or it will default to
-- SQL Server 2000.
USE [AdventureWorks]
EXEC sp_addmergepublication
-- Specify the required parameters.
@publication = @publication,
@publication_compatibility_level = N'90RTM',
@enabled_for_internet = N'true',
@snapshot_in_defaultfolder = N'true',
@alt_snapshot_folder = @snapshot_folder,
@ftp_address = @ftp_server,
@ftp_subdirectory = @ftp_directory,
@ftp_login = @ftp_login,
@ftp_password = @ftp_password;
-- Create the snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = @login,
@job_password = @password;
-- Add an unfiltered article for the Customer table.
EXEC sp_addmergearticle
@publication = @publication,
@article = @article,
@source_object = @article,
@type = N'table',
@source_owner = @owner,
@destination_owner = @owner,
@column_tracking = N'true';
-- Start the snapshot job for the publication.
EXEC sp_startpublication_snapshot
@publication = @publication;
GO
以下示例创建对合并发布的订阅,其中订阅者使用 FTP 获取快照。 访问 FTP 共享时,订阅服务器应使用安全的 VPN 连接。 sqlcmd 脚本变量用于提供登录名和密码值。 有关详细信息,请参阅 将 sqlcmd 与脚本变量配合使用。
-- 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".
-- Execute this batch at the Publisher.
DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksSalesOfferMergeFtp';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorksReplica';
-- At the Publisher, register the subscription, using the defaults.
EXEC sp_addmergesubscription
@publication = @publication,
@subscriber = @subscriber,
@subscriber_db = @subscriptionDB,
@subscription_type = N'pull',
@subscriber_type = N'local',
@subscription_priority = 0,
@sync_type = N'Automatic';
GO
-- 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".
-- Execute this batch at the Subscriber.
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publicationDB = N'AdventureWorks';
SET @publication = N'AdvWorksSalesOfferMergeFtp';
SET @publisher = $(PubServer);
SET @login = $(Login);
SET @password = $(Password);
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorksReplica';
EXEC sp_addmergepullsubscription
@publisher = @publisher,
@publication = @publication,
@publisher_db = @publicationDB,
@subscriber_type = N'Local',
@subscription_priority = 0,
@sync_type = N'Automatic';
exec sp_addmergepullsubscription_agent
@publisher = @publisher,
@publisher_db = @publicationDB,
@publication = @publication,
@distributor = @publisher,
@distributor_security_mode = 1,
@use_ftp = N'true',
@job_login = @login,
@job_password = @password,
@publisher_security_mode = 1,
@use_web_sync = 0;
GO