Cómo entregar una instantánea a través de FTP (programación de la replicación con Transact-SQL)

Se puede establecer la opción para que los archivos de instantáneas estén disponibles en un servidor FTP y se puede modificar esta configuración mediante programación empleando los procedimientos almacenados de replicación. El procedimiento usado depende del tipo de publicación. La entrega de instantáneas a través de FTP sólo se usa con suscripciones de extracción.

Nota de seguridadNota de seguridad

Para contribuir a mejorar la seguridad, se recomienda implementar una red privada virtual (VPN) al utilizar la entrega de instantáneas a través de FTP por Internet. Para obtener más información, vea Publicar datos por Internet mediante VPN.

Para habilitar la entrega de instantáneas a través de FTP para una publicación transaccional o de instantáneas

  • En la base de datos de publicación del Publicador, ejecute sp_addpublication. Especifique @publication, un valor de true para @enabled_for_internety los valores adecuados para los parámetros siguientes:

    • @ftp_address: la dirección del servidor FTP usada para entregar la instantánea

    • (Opcional) @ftp_port: el puerto usado por el servidor FTP

    • (Opcional) @ftp_subdirectory: el subdirectorio del directorio FTP predeterminado asignado a un inicio de sesión de FTP. Por ejemplo, si el directorio raíz del servidor de FTP es \\servidorFTP\inicio y desea almacenar las instantáneas en \\servidorFTP\inicio\instantáneas, especifique \instantáneas\ftp para @ftp_subdirectory (la replicación anexa 'ftp' a la ruta de acceso de la carpeta de instantáneas al crear los archivos de instantáneas).

    • (Opcional) @ftp_login: una cuenta de inicio de sesión usada al conectar al servidor FTP

    • (Opcional) @ftp_password: la contraseña para el inicio de sesión de FTP

      Nota de seguridadNota de seguridad

      Por seguridad, se recomienda no permitir el inicio de sesión anónimo en el servidor de FTP.

    Nota

    El Agente de instantáneas debe tener permisos de escritura para el directorio especificado y el Agente de distribución o de mezcla debe tener permisos de lectura. Si usa suscripciones de extracción, debe especificar un directorio compartido como una ruta de acceso UNC (Convención de nomenclatura universal), por ejemplo \\servidorFTP\inicio\instantáneas. Para obtener más información, vea Proteger la carpeta de instantáneas.

    Esto crea una publicación que usa FTP. Para obtener más información, vea Cómo crear una publicación (programación de la replicación con Transact-SQL).

Para habilitar la entrega de instantáneas a través de FTP para una publicación de mezcla

  • En la base de datos de publicación del publicador, ejecute sp_addmergepublication. Especifique @publication, un valor de true para @enabled_for_internety los valores adecuados para los parámetros siguientes:

    • @ftp_address: la dirección del servidor FTP usada para entregar la instantánea

    • (Opcional) @ftp_port: el puerto usado por el servidor FTP

    • (Opcional) @ftp_subdirectory: el subdirectorio del directorio FTP predeterminado asignado a un inicio de sesión de FTP. Por ejemplo, si el directorio raíz del servidor de FTP es \\servidorFTP\inicio y desea almacenar las instantáneas en \\servidorFTP\inicio\instantáneas, especifique \instantáneas\ftp para @ftp_subdirectory (la replicación anexa 'ftp' a la ruta de acceso de la carpeta de instantáneas al crear los archivos de instantáneas).

    • (Opcional) @ftp_login: una cuenta de inicio de sesión usada al conectar al servidor FTP

    • (Opcional) @ftp_password: la contraseña para el inicio de sesión de FTP

      Nota de seguridadNota de seguridad

      Por seguridad, se recomienda no permitir el inicio de sesión anónimo en el servidor de FTP.

    Nota

    El Agente de instantáneas debe tener permisos de escritura para el directorio especificado y el Agente de distribución o de mezcla debe tener permisos de lectura. Si usa suscripciones de extracción, debe especificar un directorio compartido como una ruta de acceso UNC (Convención de nomenclatura universal), por ejemplo \\servidorFTP\inicio\instantáneas. Para obtener más información, vea Proteger la carpeta de instantáneas.

    Esto crea una publicación que usa FTP. Para obtener más información, vea Cómo crear una publicación (programación de la replicación con Transact-SQL).

Para crear una suscripción de extracción a una publicación transaccional o de instantáneas que usa la entrega de instantáneas a través de FTP

  1. En el publicador de la base de datos de suscripciones, ejecute sp_addpullsubscription. Especifique @publisher y @publication.

    • En el suscriptor de la base de datos de suscripciones, ejecute sp_addpullsubscription_agent. Especifique @publisher, @publisher_db, @publication, las credenciales de Microsoft Windows con las que se ejecuta el Agente de distribución en el suscriptor para @job_login y @job_password y un valor de true para @use_ftp.
  2. En la base de datos de publicación del publicador, ejecute sp_addsubscription para registrar la suscripción de extracción. Para obtener más información, vea Cómo crear una suscripción de extracción (programación de la replicación con Transact-SQL).

Para crear una suscripción de extracción a una publicación mezcla que use la entrega de instantáneas a través de FTP

  1. En la base de datos de suscripciones del suscriptor, ejecute sp_addmergepullsubscription. Especifique @publisher y @publication.

  2. En el suscriptor de la base de datos de suscripciones, ejecute sp_addmergepullsubscription_agent. Especifique @publisher, @publisher_db, @publication, las credenciales de Windows con las que se ejecuta el Agente de distribución en el suscriptor para @job_login y @job_password y un valor de true para @use_ftp.

  3. En la base de datos de publicación del publicador, ejecute sp_addmergesubscription para registrar la suscripción de extracción. Para obtener más información, vea Cómo crear una suscripción de extracción (programación de la replicación con Transact-SQL).

Para cambiar una o más configuraciones de entrega de instantáneas a través de FTP para una publicación transaccional o de instantáneas

  1. En la base de datos de publicación del publicador, ejecute sp_changepublication. Especifique uno de los siguientes valores para @property y un nuevo valor de esta configuración para @value:

    • ftp_address: la dirección del servidor FTP usada para entregar la instantánea

    • ftp_port: el puerto usado por el servidor FTP

    • ftp_subdirectory: el subdirectorio del directorio FTP predeterminado usado para la instantánea de FTP

    • ftp_login: un inicio de sesión para conectar al servidor de FTP

    • ftp_password: la contraseña del inicio de sesión de FTP

    Nota de seguridadNota de seguridad

    Cuando sea posible, pida a los usuarios que proporcionen sus credenciales en tiempo de ejecución. Si almacena las credenciales en un archivo de script, debe proteger el archivo.

  2. (Opcional) Repita el paso 1 para cada configuración de FTP que se está cambiando.

  3. (Opcional) Para deshabilitar la entrega de instantáneas a través de FTP, ejecute sp_changepublication en el Publicador de la base de datos de publicación. Especifique un valor de enabled_for_internet para @propertyy un valor de false para @value.

Para cambiar la configuración de entrega de instantáneas a través de FTP para una publicación de mezcla

  1. En la base de datos de publicación del publicador, ejecute sp_changemergepublication. Especifique uno de los siguientes valores para @property y un nuevo valor de esta configuración para @value:

    • ftp_address: la dirección del servidor FTP usada para entregar la instantánea

    • ftp_port: el puerto usado por el servidor FTP

    • ftp_subdirectory: el subdirectorio del directorio FTP predeterminado usado para la instantánea de FTP

    • ftp_login: un inicio de sesión para conectar al servidor de FTP

    • ftp_password: la contraseña para el inicio de sesión de FTP

    Nota de seguridadNota de seguridad

    Cuando sea posible, pida a los usuarios que proporcionen sus credenciales en tiempo de ejecución. Si almacena las credenciales en un archivo de script, debe proteger el archivo.

  2. (Opcional) Repita el paso 1 para cada configuración de FTP que se está cambiando.

  3. (Opcional) Para deshabilitar la entrega de instantáneas a través de FTP, ejecute sp_changemergepublication en el Publicador de la base de datos de publicación. Especifique un valor de enabled_for_internet para @property y un valor de false para @value.

Ejemplo

El ejemplo siguiente crea una publicación de mezcla que permite a los Suscriptores tener acceso a los datos de instantánea usando FTP. El Suscriptor debería usar una conexión VPN segura al tener acceso al recurso compartido de FTP. Las variables de scripts sqlcmd se usan para proporcionar valores de inicio de sesión y contraseña. Para obtener más información, vea Usar sqlcmd con variables de script.

-- 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'AdventureWorks2008R2'; 
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 [AdventureWorks2008R2]
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

El ejemplo siguiente crea una suscripción a una publicación de mezcla, donde el Suscriptor obtiene la instantánea mediante FTP. El Suscriptor debería usar una conexión VPN segura al tener acceso al recurso compartido de FTP. Las variables de scripts sqlcmd se usan para proporcionar valores de inicio de sesión y contraseña. Para obtener más información, vea Usar sqlcmd con variables de script.

-- 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'AdventureWorks2008R2Replica';

-- 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'AdventureWorks2008R2'; 
SET @publication = N'AdvWorksSalesOfferMergeFtp'; 
SET @publisher = $(PubServer);
SET @login = $(Login);
SET @password = $(Password);
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2008R2Replica';

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