Cómo crear una instantánea para una publicación de mezcla con filtros con parámetros (programación de la replicación con Transact-SQL)
Si desea generar instantáneas para publicaciones usando filtros con parámetros, debe generar primero una instantánea estándar (o de esquema) que contenga todos los datos publicados y los metadatos del Suscriptor para la suscripción. Para obtener más información, vea Cómo crear la instantánea inicial (programación de la replicación con Transact-SQL). Después de haber creado la instantánea del esquema, puede generar la instantánea que contiene la partición específica del Suscriptor de los datos publicados.
Con los procedimientos almacenados y el Agente de instantáneas, puede:
Permitir a los Suscriptores que soliciten la generación y aplicación de instantáneas la primera vez que se sincronicen.
Generar previamente las instantáneas para cada partición.
Generar manualmente una instantánea para cada Suscriptor.
Nota de seguridad Cuando sea posible, pida a los usuarios que especifiquen credenciales de seguridad en tiempo de ejecución. Si debe almacenar credenciales en un archivo de script, protéjalo para evitar el acceso no autorizado.
Para crear una publicación que permita a los Suscriptores iniciar la generación y entrega de instantáneas
En la base de datos de publicación del publicador, ejecute sp_addmergepublication (Transact-SQL). Especifique los parámetros siguientes:
El nombre de la base de datos de publicación para @publication.
Un valor de true para @allow_subscriber_initiated_snapshot, que permite a los Suscriptores iniciar el proceso de instantánea.
(Opcional) El número de procesos de instantáneas dinámicas que se pueden ejecutar de manera simultánea para @max_concurrent_dynamic_snapshots. Si se está ejecutando el número máximo de procesos y un Suscriptor intenta generar una instantánea, el proceso se coloca en una cola. De forma predeterminada, no hay límite al número de procesos simultáneos.
En el publicador, ejecute sp_addpublication_snapshot (Transact-SQL). Especifique el nombre de publicación usado en el paso 1 para @publication y las credenciales de Microsoft Windows con las que se ejecuta el Agente de instantáneas de replicación para @job_login y @password. Si el agente va a usar autenticación de SQL Server al conectarse al publicador, también debe especificar un valor de 0 para @publisher_security_mode y la información de inicio de sesión de MicrosoftSQL Server para @publisher_login y @publisher_password. Esto crea un trabajo de Agente de instantáneas para la publicación. Para obtener más información sobre cómo generar una instantánea inicial y definir una programación personalizada para el Agente de instantáneas, vea Cómo crear la instantánea inicial (programación de la replicación con Transact-SQL).
Nota de seguridad Al configurar un Publicador con un Distribuidor remoto, los valores suministrados para todos los parámetros, incluidos job_login y job_password, se envían al distribuidor como texto simple. Antes de ejecutar este procedimiento almacenado, debe cifrar la conexión entre el Publicador y su Distribuidor remoto. Para obtener más información, vea Cifrar conexiones a SQL Server.
Ejecute sp_addmergearticle (Transact-SQL) para agregar artículos a la publicación. Este procedimiento almacenado se debe ejecutar una vez para cada artículo de la publicación. Al usar los filtros con parámetros, debe especificar un filtro de fila con parámetros para uno o más artículos usando el parámetro @subset_filterclause. Para obtener más información, vea Cómo definir y modificar un filtro de fila con parámetros para un artículo de mezcla (programación de la replicación con Transact-SQL).
Si se van a filtrar otros artículos según el filtro de fila con parámetros, ejecute sp_addmergefilter (Transact-SQL) para definir la combinación o las relaciones de registros lógicos entre los artículos. Este procedimiento almacenado se debe ejecutar una vez para cada relación que se está definiendo. Para obtener más información, vea Cómo definir y modificar un filtro de combinación entre artículos de mezcla (programación de la replicación con Transact-SQL).
Cuando el Agente de mezcla solicita a la instantánea que inicialice el Suscriptor, se genera automáticamente la instantánea para la partición de la suscripción solicitante.
Para crear una publicación y pregenerar o actualizar automáticamente las instantáneas
Ejecute sp_addmergepublication (Transact-SQL) para crear la publicación. Para obtener más información, vea Cómo crear una publicación (programación de la replicación con Transact-SQL).
En el publicador, ejecute sp_addpublication_snapshot (Transact-SQL). Especifique el nombre de publicación usado en el paso 1 para @publication y las credenciales de Windows con las que se ejecuta el Agente de instantáneas para @job_login y @password. Si el agente va a usar autenticación de SQL Server al conectarse al publicador, también debe especificar un valor de 0 para @publisher_security_mode y la información de inicio de sesión de SQL Server para @publisher_login y @publisher_password. Esto crea un trabajo de Agente de instantáneas para la publicación. Para obtener más información sobre cómo generar una instantánea inicial y definir una programación personalizada para el Agente de instantáneas, vea Cómo crear la instantánea inicial (programación de la replicación con Transact-SQL).
Nota de seguridad Al configurar un Publicador con un Distribuidor remoto, los valores suministrados para todos los parámetros, incluidos job_login y job_password, se envían al distribuidor como texto simple. Antes de ejecutar este procedimiento almacenado, debe cifrar la conexión entre el publicador y su distribuidor remoto. Para obtener más información, vea Cifrar conexiones a SQL Server.
Ejecute sp_addmergearticle (Transact-SQL) para agregar artículos a la publicación. Este procedimiento almacenado se debe ejecutar una vez para cada artículo de la publicación. Al usar los filtros con parámetros, debe especificar un filtro de fila con parámetros para un artículo usando el parámetro @subset_filterclause. Para obtener más información, vea Cómo definir y modificar un filtro de fila con parámetros para un artículo de mezcla (programación de la replicación con Transact-SQL).
Si se van a filtrar otros artículos según el filtro de fila con parámetros, ejecute sp_addmergefilter (Transact-SQL) para definir la combinación o las relaciones de registros lógicos entre los artículos. Este procedimiento almacenado se debe ejecutar una vez para cada relación que se está definiendo. Para obtener más información, vea Cómo definir y modificar un filtro de combinación entre artículos de mezcla (programación de la replicación con Transact-SQL).
En la base de datos de publicación del publicador, ejecute sp_helpmergepublication (Transact-SQL), especificando el valor de @publication del paso 1. Tenga en cuenta el valor de snapshot_jobid en el conjunto de resultados.
Convierta el valor de snapshot_jobid obtenido en el paso 5 a uniqueidentifier.
En el Publicador en la base de datos msdb, ejecute sp_start_job (Transact-SQL), especificando el valor convertido obtenido en el paso 6 para @job_id.
En la base de datos de publicación del publicador, ejecute sp_addmergepartition (Transact-SQL). Especifique el nombre de la publicación del paso 1 para @publication y el valor usado para definir la partición para @suser_sname si se usa SUSER_SNAME (Transact-SQL) en la cláusula de filtro o para @host_name si se usa HOST_NAME (Transact-SQL) en la cláusula de filtro.
En la base de datos de publicación del publicador, ejecute sp_adddynamicsnapshot_job (Transact-SQL). Especifique el nombre de la publicación del paso 1 para @publication, el valor de @suser_sname o @host_name del paso 8 y una programación para el trabajo. Esto crea el trabajo que genera la instantánea con parámetros para la partición especificada. Para obtener más información, vea Cómo especificar programaciones de sincronización (programación de la replicación con Transact-SQL).
[!NOTA]
Este trabajo se ejecuta usando la misma cuenta de Windows que el trabajo de la instantánea inicial definido en el paso 2. Para quitar el trabajo de la instantánea con parámetros y su partición de datos relacionados, ejecute sp_dropdynamicsnapshot_job (Transact-SQL).
En la base de datos de publicación del publicador, ejecute sp_helpmergepartition (Transact-SQL), especificando el valor de @publication del paso 1 y el valor de @suser_sname o @host_name del paso 8. Tenga en cuenta el valor de dynamic_snapshot_jobid en el conjunto de resultados.
En el Distribuidor en la base de datos msdb, ejecute sp_start_job (Transact-SQL), especificando el valor obtenido en el paso 9 para @job_id. Esto inicia el trabajo de instantánea con parámetros para la partición.
Repita los pasos 8-11 para generar una instantánea con particiones para cada suscripción.
Para crear una publicación y crear manualmente instantáneas para cada partición
Ejecute sp_addmergepublication (Transact-SQL) para crear la publicación. Para obtener más información, vea Cómo crear una publicación (programación de la replicación con Transact-SQL).
En el publicador, ejecute sp_addpublication_snapshot (Transact-SQL). Especifique el nombre de publicación usado en el paso 1 para @publication y las credenciales de Windows con las que se ejecuta el Agente de instantáneas para @job_login y @password. Si el agente va a usar autenticación de SQL Server al conectarse al publicador, también debe especificar un valor de 0 para @publisher_security_mode y la información de inicio de sesión de SQL Server para @publisher_login y @publisher_password. Esto crea un trabajo de Agente de instantáneas para la publicación. Para obtener más información sobre cómo generar una instantánea inicial y definir una programación personalizada para el Agente de instantáneas, vea Cómo crear la instantánea inicial (programación de la replicación con Transact-SQL).
Nota de seguridad Al configurar un Publicador con un Distribuidor remoto, los valores suministrados para todos los parámetros, incluidos job_login y job_password, se envían al distribuidor como texto simple. Antes de ejecutar este procedimiento almacenado, debe cifrar la conexión entre el Publicador y su Distribuidor remoto. Para obtener más información, vea Cifrar conexiones a SQL Server.
Ejecute sp_addmergearticle (Transact-SQL) para agregar artículos a la publicación. Este procedimiento almacenado se debe ejecutar una vez para cada artículo de la publicación. Al usar los filtros con parámetros, debe especificar un filtro de fila con parámetros para un artículo, al menos, usando el parámetro @subset_filterclause. Para obtener más información, vea Cómo definir y modificar un filtro de fila con parámetros para un artículo de mezcla (programación de la replicación con Transact-SQL).
Si se van a filtrar otros artículos según el filtro de fila con parámetros, ejecute sp_addmergefilter (Transact-SQL) para definir la combinación o las relaciones de registros lógicos entre los artículos. Este procedimiento almacenado se debe ejecutar una vez para cada relación que se está definiendo. Para obtener más información, vea Cómo definir y modificar un filtro de combinación entre artículos de mezcla (programación de la replicación con Transact-SQL).
Inicie el trabajo de la instantánea o ejecute el Agente de instantáneas de replicación desde el símbolo del sistema para generar el esquema de instantáneas estándar y otros archivos. Para obtener más información, vea Cómo crear la instantánea inicial (programación de la replicación con Transact-SQL).
Ejecute de nuevo el Agente de instantáneas de replicación desde el símbolo del sistema para generar los archivos de copia masiva (.bcp), especificando la ubicación de la instantánea con particiones para -DynamicSnapshotLocation y una o ambas de las siguientes propiedades que define la partición:
-DynamicFilterHostName - el valor si se usa HOST_NAME (Transact-SQL).
-DynamicFilterLogin - el valor si se usa SUSER_SNAME (Transact-SQL).
Repita el paso 6 para generar una instantánea con particiones para cada suscripción.
Ejecute el Agente de mezcla para que cada suscripción aplique la instantánea con particiones inicial en los Suscriptores, especificando las propiedades siguientes:
-Hostname - el valor usado para definir la partición si se invalida el valor real de HOST_NAME.
-DynamicSnapshotLocation - la ubicación de la instantánea dinámica para esta partición.
[!NOTA]
Para obtener más información sobre los agentes de replicación de programación, vea Conceptos de los ejecutables del Agente de replicación.
Ejemplo
Este ejemplo crea una publicación de mezcla con filtros con parámetros donde los Suscriptores inician el proceso de generación de instantáneas. Se pasan los valores para @job_login y @job_password al usar las variables de scripts.
-- 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".
--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;
SET @publicationdb = N'AdventureWorks';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';
USE [AdventureWorks];
-- Enable AdventureWorks for merge replication.
EXEC sp_replicationdboption
@dbname = @publicationdb,
@optname = N'merge publish',
@value = N'true';
-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule.
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication of AdventureWorks.',
@allow_subscriber_initiated_snapshot = N'true',
@publication_compatibility_level = N'90RTM';
-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = $(login),
@job_password = $(password);
-- Add an article for the Employee table,
-- which is horizontally partitioned using
-- a parameterized row filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_owner = @schema_hr,
@source_object = @table1,
@type = N'table',
@description = 'contains employee information',
@subset_filterclause = N'[LoginID] = HOST_NAME()';
-- Add an article for the SalesPerson table,
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_owner = @schema_sales,
@source_object = @table2,
@type = N'table',
@description = 'contains salesperson information';
-- Add a join filter between the two articles.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table1,
@filtername = @filter,
@join_articlename = @table2,
@join_filterclause = N'[Employee].[EmployeeID] = [SalesPerson].[SalesPersonID]',
@join_unique_key = 1,
@filter_type = 1;
GO
-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time
-- the subscription is synchronized.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';
EXEC sp_startpublication_snapshot
@publication = @publication;
GO
Este ejemplo crea una publicación mediante un filtro con parámetros donde cada Suscriptor tiene su partición definida ejecutando sp_addmergepartition y el trabajo de instantánea filtrado creado ejecutando sp_adddynamicsnapshot_job que pasa la información de la partición. Se pasan los valores para @job_login y @job_password al usar las variables de scripts.
-- 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".
--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;
SET @publicationdb = N'AdventureWorks';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';
USE [AdventureWorks];
-- Enable AdventureWorks for merge replication.
EXEC sp_replicationdboption
@dbname = @publicationdb,
@optname = N'merge publish',
@value = N'true';
-- Create new merge publication.
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication of AdventureWorks.',
@allow_subscriber_initiated_snapshot = N'false';
-- Create a new snapshot job for the publication, using the
-- default schedule. Pass credentials at runtime using
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = $(Login),
@job_password = $(password);
-- Add an article for the Employee table,
-- which is horizontally partitioned using
-- a parameterized row filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_owner = @schema_hr,
@source_object = @table1,
@type = N'table',
@description = 'contains employee information',
@subset_filterclause = N'[LoginID] = HOST_NAME()';
-- Add an article for the SalesPerson table,
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_owner = @schema_sales,
@source_object = @table2,
@type = N'table',
@description = 'contains customer information';
-- Add a join filter between the two articles.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table1,
@filtername = @filter,
@join_articlename = @table2,
@join_filterclause = N'[Employee].[EmployeeID] = [SalesPerson].[SalesPersonID]',
@join_unique_key = 1,
@filter_type = 1;
GO
-- Start the snapshot agent job.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';
EXEC sp_startpublication_snapshot
@publication = @publication;
GO
PRINT '*** Waiting for the initial snapshot.';
GO
-- Create a temporary table to store the filtered data snapshot
-- job information.
CREATE TABLE #temp (id int,
job_name sysname,
job_id uniqueidentifier,
dynamic_filter_login sysname NULL,
dynamic_filter_hostname sysname NULL,
dynamic_snapshot_location nvarchar(255),
frequency_type int,
frequency_interval int,
frequency_subday_type int,
frequency_subday_interval int,
frequency_relative_interval int,
frequency_recurrence_factor int,
active_start_date int,
active_end_date int,
active_start_time int,
active_end_time int
)
-- Create each snapshot for a partition
-- The initial snapshot must already be generated.
DECLARE @publication AS sysname;
DECLARE @jobname AS sysname
DECLARE @hostname AS sysname
SET @publication = N'AdvWorksSalesPersonMerge';
SET @hostname = N'adventure-works\Fernando';
WHILE NOT EXISTS(SELECT * FROM sysmergepublications
WHERE [name] = @publication
AND snapshot_ready = 1)
BEGIN
WAITFOR DELAY '00:00:05'
END
-- Create a data partition by overriding HOST_NAME().
EXEC sp_addmergepartition
@publication = @publication,
@host_name = @hostname;
-- Create the filtered data snapshot job, and use the returned
-- information to start the job.
EXEC sp_adddynamicsnapshot_job
@publication = @publication,
@host_name = @hostname;
INSERT INTO #temp (id, job_name, job_id, dynamic_filter_login,
dynamic_filter_hostname, dynamic_snapshot_location,
frequency_type, frequency_interval, frequency_subday_type,
frequency_subday_interval, frequency_relative_interval,
frequency_recurrence_factor, active_start_date, active_end_date,
active_start_time,active_end_time)
EXEC sp_helpdynamicsnapshot_job;
SELECT @jobname = (SELECT DISTINCT job_name FROM #temp WHERE dynamic_filter_hostname = @hostname);
EXEC msdb..sp_start_job @job_name = @jobname;
DROP TABLE #temp;
GO
Este ejemplo crea una publicación mediante un filtro con parámetros donde cada Suscriptor debe tener su partición de datos y el trabajo de instantánea filtrado creado proporcionando la información de la partición. Un Suscriptor proporciona información de la partición mediante los parámetros de línea de comandos al ejecutar manualmente los agentes de replicación. Este ejemplo supone que también se ha creado una suscripción a la publicación.
-- 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".
--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;
SET @publicationdb = N'AdventureWorks';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';
USE [AdventureWorks];
-- Enable AdventureWorks for merge replication.
EXEC sp_replicationdboption
@dbname = @publicationdb,
@optname = N'merge publish',
@value = N'true';
-- Create new merge publication.
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication of AdventureWorks.',
@allow_subscriber_initiated_snapshot = N'false';
-- Create a new snapshot job for the publication, using the
-- default schedule. Pass credentials at runtime using
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = $(Login),
@job_password = $(Password);
-- Add an article for the Employee table,
-- which is horizontally partitioned using
-- a parameterized row filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_owner = @schema_hr,
@source_object = @table1,
@type = N'table',
@description = 'contains employee information',
@subset_filterclause = N'[LoginID] = HOST_NAME()';
-- Add an article for the SalesPerson table,
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_owner = @schema_sales,
@source_object = @table2,
@type = N'table',
@description = 'contains customer information';
-- Add a join filter between the two articles.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table1,
@filtername = @filter,
@join_articlename = @table2,
@join_filterclause = N'[Employee].[EmployeeID] = [SalesPerson].[SalesPersonID]',
@join_unique_key = 1,
@filter_type = 1;
GO
REM Line breaks are added to improve readability.
REM In a batch file, commands must be made in a single line.
REM Run the Snapshot agent from the command line to generate the standard snapshot
REM schema and other files.
SET DistPub=%computername%
SET PubDB=AdventureWorks
SET PubName=AdvWorksSalesPersonMerge
"C:\Program Files\Microsoft SQL Server\100\COM\SNAPSHOT.EXE" -Publication %PubName%
-Publisher %DistPub% -Distributor %DistPub% -PublisherDB %PubDB% -ReplicationType 2
-OutputVerboseLevel 1 -DistributorSecurityMode 1
PAUSE
REM Run the Snapshot agent from the command line, this time to generate
REM the bulk copy (.bcp) data for each Subscriber partition.
SET DistPub=%computername%
SET PubDB=AdventureWorks
SET PubName=AdvWorksSalesPersonMerge
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando
MD %SnapshotDir%
"C:\Program Files\Microsoft SQL Server\100\COM\SNAPSHOT.EXE" -Publication %PubName%
-Publisher %DistPub% -Distributor %DistPub% -PublisherDB %PubDB% -ReplicationType 2
-OutputVerboseLevel 1 -DistributorSecurityMode 1 -DynamicFilterHostName "adventure-works\Fernando"
-DynamicSnapshotLocation %SnapshotDir%
PAUSE
REM Run the Merge Agent for each subscription to apply the partitioned
REM snapshot for each Subscriber.
SET Publisher = %computername%
SET Subscriber = %computername%
SET PubDB = AdventureWorks
SET SubDB = AdventureWorksReplica
SET PubName = AdvWorksSalesPersonMerge
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando
"C:\Program Files\Microsoft SQL Server\100\COM\REPLMERG.EXE" -Publisher %Publisher%
-Subscriber %Subscriber% -Distributor %Publisher% -PublisherDB %PubDB%
-SubscriberDB %SubDB% -Publication %PubName% -PublisherSecurityMode 1 -OutputVerboseLevel 3
-Output -SubscriberSecurityMode 1 -SubscriptionType 3 -DistributorSecurityMode 1
-Hostname "adventure-works\Fernando" -DynamicSnapshotLocation %SnapshotDir%
PAUSE
Vea también