Crear una instantánea para una publicación de mezcla con filtros con parámetros

Se aplica a:SQL Server

En este tema se describe cómo se crea una instantánea de una publicación de mezcla con filtros con parámetros en SQL Server mediante SQL Server Management Studio, Transact-SQL o Replication Management Objects (RMO).

Cuando se utilizan filtros de fila con parámetros en las publicaciones de combinación, la replicación inicializa cada suscripción con una instantánea en dos partes. Primero, se crea una instantánea de esquema que contiene todos los objetos necesarios para la replicación y el esquema de los objetos publicados, pero no los datos. Después, se inicializa cada suscripción con una instantánea que incluye los objetos y el esquema de la instantánea de esquema, y los datos que pertenecen a la partición de la suscripción. Si hay más de una suscripción que recibe una partición determinada (es decir, que reciben el mismo esquema y los mismos datos), la instantánea de esa partición se creará una sola vez; se inicializarán varias suscripciones con la misma instantánea. Para obtener más información acerca de los filtros de fila con parámetros, vea Parameterized Row Filters.

Puede crear instantáneas para publicaciones con filtros con parámetros de las tres formas siguientes:

  • Genere previamente las instantáneas para cada partición. Esta opción le permite controlar cuándo se generan las instantáneas.
    También puede elegir que las instantáneas se actualicen de acuerdo con una programación. Los suscriptores nuevos que se suscriban a una partición para la que se ha creado una instantánea recibirán una instantánea actualizada.

  • Permita a los suscriptores que soliciten la generación y aplicación de instantáneas la primera vez que se sincronicen. Esta opción permite a los nuevos suscriptores sincronizarse sin la intervención de un administrador (el Agente SQL Server se debe estar ejecutando en el publicador para que se pueda generar la instantánea).

    Nota:

    Si el filtrado de uno o más artículos de la publicación produce particiones no superpuestas y únicas para cada suscripción, los metadatos se limpian cada vez que se ejecuta el Agente de mezcla. Esto significa que la instantánea con particiones expira antes. Cuando utilice esta opción, puede ser conveniente permitir a los suscriptores que inicien la generación y entrega de instantáneas. Para obtener más información acerca de las opciones de filtro, vea Parameterized Row Filters.

  • Genere manualmente una instantánea para cada suscriptor con el Agente de instantáneas. A continuación, el suscriptor deberá proporcionar la ubicación de la instantánea al Agente de mezcla para que pueda recuperar y aplicar la instantánea correcta.

    Nota:

    Esta opción se admite para la compatibilidad con versiones anteriores y no permite los recursos compartidos de instantáneas en FTP.

El enfoque más flexible es utilizar una combinación de opciones de instantáneas generadas previamente y solicitadas por el suscriptor: las instantáneas se generan previamente y se actualizan según una programación (por lo general, durante los períodos de menor actividad), pero un suscriptor puede generar su propia instantánea si se crea una suscripción que necesita una partición nueva.

Considere Adventure Works, que tiene un personal móvil que proporciona inventarios a las tiendas. Cada vendedor recibe una suscripción según su inicio de sesión, que recupera los datos de las tiendas a las que prestan servicio. El administrador genera previamente las instantáneas y las actualiza cada domingo. Ocasionalmente, se agrega al sistema un usuario nuevo que necesita datos para una partición que no tiene una instantánea disponible. El administrador también permite las instantáneas iniciadas por el suscriptor, con el fin de evitar situaciones en las que un suscriptor no puede suscribirse a la publicación porque la instantánea aún no está disponible. Cuando el nuevo suscriptor se conecta por primera vez, se genera la instantánea para la partición especificada y se aplica al suscriptor (debe ejecutarse el Agente SQL Server en el publicador para que se pueda generar la instantánea).

Para crear una instantánea para una publicación con filtros con parámetros, vea Crear una instantánea para una publicación de mezcla con filtros con parámetros.

Configuración de seguridad para el Agente de instantáneas

El Agente de instantáneas crea instantáneas para cada partición. Para las instantáneas generadas previamente y las solicitadas por un suscriptor, el agente se ejecuta y establece conexiones con las credenciales especificadas cuando se creó el trabajo del Agente de instantáneas para la publicación (el trabajo lo crea el Asistente para nueva publicación o sp_addpublication_snapshot). Para cambiar las credenciales, utilice sp_changedynamicsnapshot_job. Para obtener más información, consulte sp_changedynamicsnapshot_job (Transact-SQL).

Recomendaciones

  • Si desea generar una instantánea de una publicación de combinación mediante 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 más información, consulte Crear y aplicar la instantánea inicial. 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.

  • Si el filtrado de uno o más artículos de la publicación produce particiones no superpuestas y únicas para cada suscripción, los metadatos se limpian cada vez que se ejecuta el Agente de mezcla. Esto significa que la instantánea con particiones expira antes. Cuando utilice esta opción, puede ser conveniente permitir a los suscriptores que inicien la generación y entrega de instantáneas.

Uso de SQL Server Management Studio

Genere instantáneas de particiones en la página Particiones de datos del cuadro de diálogo Propiedades de la publicación: <Publicación>. Para obtener más información sobre el acceso a este cuadro de diálogo, vea View and Modify Publication Properties. Puede permitir a los suscriptores iniciar la generación y entrega de instantáneas y/o generar instantáneas.

Antes de generar instantáneas de una o varias particiones debe:

  1. Crear una publicación de combinación con el Asistente para nueva publicación y especificar uno o varios filtros de fila con parámetros en la página Agregar filtro del asistente. Para más información, consulte Definir y modificar un filtro de fila con parámetros para un artículo de mezcla.

  2. Generar una instantánea del esquema para la publicación. De forma predeterminada, se genera una instantánea del esquema al completar el Asistente para nueva publicación, aunque también puede generar una instantánea del esquema desde SQL Server Management Studio.

Para generar una instantánea del esquema

  1. Conéctese al publicador en Management Studio y, a continuación, expanda el nodo de servidor.

  2. Expanda la carpeta Replicación y, a continuación, la carpeta Publicaciones .

  3. Haga clic con el botón secundario en la publicación para la que desee crear una instantánea y, a continuación, haga clic en Ver estado del agente de instantáneas.

  4. En el cuadro de diálogo Ver estado del Agente de instantáneas: <publicación>, haga clic en Iniciar.

    Cuando el Agente de instantáneas termina de generar la instantánea, aparece un mensaje del tipo "[100%] Se ha generado una instantánea de 17 artículos".

Para permitir a los suscriptores inicializar la generación y distribución de instantáneas

  1. En la página Particiones de datos del cuadro de diálogo Propiedades de la publicación: <Publicación>, seleccione Definir automáticamente una partición y generar una instantánea si es necesario cuando un suscriptor nuevo intente sincronizarse.

  2. Seleccione Aceptar.

Para generar y actualizar instantáneas

  1. En la página Particiones de datos del cuadro de diálogo Propiedades de la publicación: <publicación>, haga clic en Agregar.

  2. Escriba un valor para HOST_NAME() y/o el valor SUSER_SNAME() asociado con la partición para la que desea crear una instantánea.

  3. También puede especificar una programación para actualizar las instantáneas:

    1. Seleccione Programar el Agente de instantáneas para que esta partición se ejecute a las horas siguientes.

    2. Acepte la programación predeterminada para actualizar instantáneas o haga clic en Cambiar para especificar una programación diferente.

  4. Haga clic en Aceptar, que le lleva de vuelta al cuadro de diálogo Propiedades de la publicación: <Publicación>.

  5. Seleccione la partición en la cuadrícula de propiedades y, a continuación, haga clic en Generar instantáneas seleccionadas ahora.

  6. Seleccione Aceptar.

Usar Transact-SQL

Con los procedimientos almacenados y el Agente de instantáneas, podrá hacer lo siguiente:

  • Permita a los suscriptores que soliciten la generación y aplicación de instantáneas la primera vez que se sincronicen.

  • Genere previamente las instantáneas para cada partición.

  • Generar manualmente una instantánea para cada Suscriptor.

    Importante

    Cuando sea posible, pida a los usuarios que proporcionen credenciales de seguridad en tiempo de ejecución. Si debe almacenar las credenciales en un archivo de script, proteja el archivo 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

  1. En el publicador de la base de datos de publicación, 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.

  2. 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 Replication Snapshot Agent para @job_login y @password. Si el agente va a usar la 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 Microsoft 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 Create and Apply the Initial Snapshot.

    Importante

    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 sin formato. Antes de ejecutar este procedimiento almacenado, se recomienda cifrar la conexión entre el publicador y su distribuidor remoto. Para obtener más información, vea Habilitar conexiones cifradas en el motor de base de datos (Administrador de configuración de SQL Server).

  3. 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 más información, consulte Definir y modificar un filtro de fila con parámetros para un artículo de mezcla.

  4. 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, consulte Definir y modificar un filtro de combinación entre artículos de mezcla.

  5. 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

  1. Ejecute sp_addmergepublication (Transact-SQL) para crear la publicación. Para obtener más información, vea Crear una suscripción.

  2. 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 la 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 Create and Apply the Initial Snapshot.

    Importante

    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 sin formato. Antes de ejecutar este procedimiento almacenado, se recomienda cifrar la conexión entre el publicador y su distribuidor remoto. Para obtener más información, vea Habilitar conexiones cifradas en el motor de base de datos (Administrador de configuración de SQL Server).

  3. 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 más información, consulte Definir y modificar un filtro de fila con parámetros para un artículo de mezcla.

  4. 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, consulte Definir y modificar un filtro de combinación entre artículos de mezcla.

  5. En el publicador de la base de datos de publicación, ejecute sp_helpmergepublication (Transact-SQL) y especifique el valor de @publication del paso 1. Tenga en cuenta el valor de snapshot_jobid en el conjunto de resultados.

  6. Convierta el valor de snapshot_jobid obtenido en el paso 5 a uniqueidentifier.

  7. En el publicador en la base de datos msdb, ejecute sp_start_job (Transact-SQL) y especifique el valor convertido obtenido en el paso 6 para @job_id.

  8. En el publicador de la base de datos de publicación, 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 ha usado SUSER_SNAME (Transact-SQL) en la cláusula de filtro o para @host_name si se ha usado HOST_NAME (Transact-SQL).

  9. En el publicador de la base de datos de publicación, 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, consulte Specify Synchronization Schedules.

    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).

  10. En el publicador de la base de datos de publicación, ejecute sp_helpmergepartition (Transact-SQL) y especifique 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.

  11. En el distribuidor de la base de datos msdb, ejecute sp_start_job (Transact-SQL) y especifique el valor obtenido en el paso 9 para @job_id. Esto inicia el trabajo de instantánea con parámetros para la partición.

  12. 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

  1. Ejecute sp_addmergepublication (Transact-SQL) para crear la publicación. Para obtener más información, vea Crear una suscripción.

  2. 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 la 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 Create and Apply the Initial Snapshot.

    Importante

    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 sin formato. Antes de ejecutar este procedimiento almacenado, se recomienda cifrar la conexión entre el publicador y su distribuidor remoto. Para obtener más información, vea Habilitar conexiones cifradas en el motor de base de datos (Administrador de configuración de SQL Server).

  3. 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 más información, consulte Definir y modificar un filtro de fila con parámetros para un artículo de mezcla.

  4. 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, consulte Definir y modificar un filtro de combinación entre artículos de mezcla.

  5. 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 más información, consulte Crear y aplicar la instantánea inicial.

  6. 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:

  7. Repita el paso 6 para generar una instantánea con particiones para cada suscripción.

  8. 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 cómo programar los agentes de replicación, consulte Conceptos de los ejecutables del Agente de replicación.

Ejemplos (Transact-SQL)

Este ejemplo crea una publicación de combinación 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 scripting.

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

-- Enable AdventureWorks2022 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 AdventureWorks2022.', 
  @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].[BusinessEntityID] = [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 scripting.

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

-- Enable AdventureWorks2022 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 AdventureWorks2022.', 
  @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].[BusinessEntityID] = [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'AdventureWorks2022';
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 [AdventureWorks2022];

-- Enable AdventureWorks2022 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 AdventureWorks2022.', 
  @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].[BusinessEntityID] = [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=AdventureWorks2022   
SET PubName=AdvWorksSalesPersonMerge  
  
"C:\Program Files\Microsoft SQL Server\120\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=AdventureWorks2022   
SET PubName=AdvWorksSalesPersonMerge  
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando  
  
MD %SnapshotDir%  
  
"C:\Program Files\Microsoft SQL Server\120\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 = AdventureWorks2022   
SET SubDB = AdventureWorks2022Replica   
SET PubName = AdvWorksSalesPersonMerge   
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando  
  
"C:\Program Files\Microsoft SQL Server\120\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  
  

Usar Replication Management Objects (RMO)

Puede utilizar Replication Management Objects (RMO) para generar mediante programación instantáneas con particiones de las maneras siguientes:

  • Permita a los suscriptores que soliciten la generación y aplicación de instantáneas la primera vez que se sincronicen.

  • Genere previamente las instantáneas para cada partición.

  • Genere manualmente una instantánea para cada suscriptor ejecutando el Agente de instantáneas.

Nota:

Si al filtrar un artículo se producen particiones no superpuestas que son únicas para cada suscripción (especificando el valor F:Microsoft.SqlServer.Replication.PartitionOptions.NonOverlappingSingleSubscription para P:Microsoft.SqlServer.Replication.MergeArticle.PartitionOption al crear un artículo de mezcla), cada vez que se ejecuta el Agente de mezcla se limpian los metadatos. Esto significa que la instantánea con particiones expira antes. Cuando utilice esta opción, puede ser conveniente permitir a los suscriptores que soliciten la generación de instantáneas. Para obtener más información, vea la sección Usar las opciones de filtrado apropiadas del tema Parameterized Row Filters.

Importante

Cuando sea posible, pida a los usuarios que proporcionen credenciales de seguridad en tiempo de ejecución. Si debe almacenar credenciales, use los servicios de cifrado (en inglés) proporcionados por Microsoft Windows .NET Framework.

Para crear una publicación que permita a los suscriptores iniciar la generación y entrega de instantáneas

  1. Cree una conexión al publicador mediante la clase ServerConnection .

  2. Cree una instancia de la clase ReplicationDatabase para la base de datos de publicación, establezca la propiedad ConnectionContext en la instancia de ServerConnection del paso 1 y llame al método LoadProperties . If LoadProperties devuelve false, confirme que la base de datos existe.

  3. If EnabledMergePublishing está establecida en false, cámbiela a true y llame a CommitPropertyChanges.

  4. Cree una instancia de la clase MergePublication y establezca las propiedades siguientes para este objeto:

    • La ServerConnection del paso 1 para ConnectionContext.

    • El nombre de la base de datos publicada para DatabaseName.

    • Un nombre de publicación para Name.

    • El número máximo de trabajos de instantáneas dinámicas que se van a ejecutar para MaxConcurrentDynamicSnapshots. Dado que las solicitudes de instantáneas iniciadas por el suscriptor pueden producirse en cualquier momento, esta propiedad limita el número de trabajos del Agente de instantáneas que se pueden ejecutar simultáneamente cuando varios suscriptores solicitan al mismo tiempo su instantánea con particiones. Cuando se está ejecutando el número máximo de trabajos, las demás solicitudes de instantáneas con particiones se ponen en la cola hasta que se completa uno de los trabajos en ejecución.

    • Utilice el operador lógico OR bit a bit (| en Visual C# y Or en Visual Basic) para agregar el valor AllowSubscriberInitiatedSnapshot a Attributes.

    • Los campos Login y Password de SnapshotGenerationAgentProcessSecurity para proporcionar las credenciales de la cuenta de Microsoft Windows con la que se ejecuta el trabajo del Agente de mezcla.

      Nota:

      Se recomienda establecer SnapshotGenerationAgentProcessSecurity cuando un miembro del rol fijo de servidor sysadmin crea la publicación. Para más información, consulte Modelo de seguridad del agente de replicación.

  5. Llame al método Create para crear la publicación.

    Importante

    Cuando se configura un Publicador con un Distribuidor remoto, los valores suministrados para todas las propiedades, incluidos SnapshotGenerationAgentProcessSecurity, se envían al Distribuidor como texto simple. Debe cifrar la conexión entre el publicador y su distribuidor remoto antes de llamar al método Create . Para obtener más información, vea Habilitar conexiones cifradas en el motor de base de datos (Administrador de configuración de SQL Server).

  6. Utilice la propiedad MergeArticle para agregar artículos a la publicación. Especifique la propiedad FilterClause al menos para un artículo que defina el filtro con parámetros. (Opcional) Cree objetos MergeJoinFilter que definan filtros de combinación entre artículos. Para más información, consulte Define an Article.

  7. Si el valor de SnapshotAgentExists es false, llame a CreateSnapshotAgent para crear el trabajo inicial de Agente de instantáneas para esta publicación.

  8. Llame al método StartSnapshotGenerationAgentJob del objeto MergePublication creado en el paso 4. Esto inicia el trabajo de agente que genera la instantánea inicial. 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 Create and Apply the Initial Snapshot.

  9. (Opcional) Compruebe que hay establecido un valor true en la propiedad SnapshotAvailable para que determine cuándo está lista para usarse la instantánea inicial.

  10. Cuando el Agente de mezcla de un suscriptor se conecta por primera vez, se genera automáticamente una instantánea con particiones.

Para crear una publicación y pregenerar o actualizar automáticamente las instantáneas

  1. Utilice una instancia de la clase MergePublication para definir una publicación de combinación. Para obtener más información, vea Crear una suscripción.

  2. Utilice la propiedad MergeArticle para agregar artículos a la publicación. Especifique la propiedad FilterClause al menos para un artículo que defina el filtro con parámetros y cree objetos MergeJoinFilter que definan filtros de unión entre artículos. Para más información, consulte Define an Article.

  3. Si el valor de SnapshotAgentExists es false, llame a CreateSnapshotAgent para crear el trabajo de Agente de instantáneas para esta publicación.

  4. Llame al método StartSnapshotGenerationAgentJob del objeto MergePublication creado en el paso 1. Este método inicia el trabajo de agente que genera la instantánea inicial. 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 Crear y aplicar la instantánea inicial.

  5. Compruebe que hay establecido un valor true en la propiedad SnapshotAvailable para que determine cuándo está lista para usarse la instantánea inicial.

  6. Cree una instancia de la clase MergePartition y establezca los criterios de filtro con parámetros para el suscriptor utilizando una o ambas de las propiedades siguientes:

  7. Cree una instancia de la clase MergeDynamicSnapshotJob y establezca la misma propiedad como en el paso 6.

  8. Utilice la clase ReplicationAgentSchedule para definir una programación para generar la instantánea filtrada para la partición del suscriptor.

  9. Utilizando la instancia de MergePublication del paso 1, llame a AddMergePartition. Pase el objeto MergePartition del paso 6.

  10. Utilizando la instancia de MergePublication del paso 1, llame al método AddMergeDynamicSnapshotJob . Pase el objeto MergeDynamicSnapshotJob del paso 7 y el objeto ReplicationAgentSchedule del paso 8.

  11. Llame a EnumMergeDynamicSnapshotJobsy busque el objeto MergeDynamicSnapshotJob para el trabajo de instantánea con particiones recientemente agregado en la matriz devuelta.

  12. Obtenga la propiedad Name de la tarea.

  13. Cree una conexión al distribuidor mediante la clase ServerConnection .

  14. Cree una instancia de la clase de Objetos de administración de SQL Server (SMO) Server , pasando el objeto ServerConnection del paso 13.

  15. Cree una instancia de la clase Job , pasando la propiedad JobServer del objeto Server del paso 14 y el nombre de trabajo del paso 12.

  16. Llame al método Start para iniciar el trabajo de instantánea con particiones.

  17. Repita los pasos 6-16 para cada suscriptor.

Para crear una publicación y crear manualmente instantáneas para cada partición

  1. Utilice una instancia de la clase MergePublication para definir una publicación de combinación. Para obtener más información, vea Crear una suscripción.

  2. Utilice la propiedad MergeArticle para agregar artículos a la publicación. Especifique la propiedad FilterClause al menos para un artículo que defina el filtro con parámetros y cree objetos MergeJoinFilter que definan filtros de combinanción entre artículos. Para más información, consulte Define an Article.

  3. Genere la instantánea inicial. Para más información, consulte Crear y aplicar la instantánea inicial.

  4. Cree una instancia de la clase SnapshotGenerationAgent y establezca las propiedades necesarias siguientes:

  5. Establezca un valor Merge para ReplicationType.

  6. Establezca una o más de las propiedades siguientes para definir los parámetros del particionamiento:

  7. Llame al método GenerateSnapshot.

  8. Repita los pasos 4-7 para cada suscriptor.

Ejemplos (RMO)

En este ejemplo se crea una publicación de combinación que permite a los suscriptores solicitar la generación de instantáneas.

// Set the Publisher, publication database, and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";

ReplicationDatabase publicationDb;
MergePublication publication;

// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);

try
{
    // Connect to the Publisher.
    conn.Connect();

    // Enable the database for merge publication.				
    publicationDb = new ReplicationDatabase(publicationDbName, conn);
    if (publicationDb.LoadProperties())
    {
        if (!publicationDb.EnabledMergePublishing)
        {
            publicationDb.EnabledMergePublishing = true;
        }
    }
    else
    {
        // Do something here if the database does not exist. 
        throw new ApplicationException(String.Format(
            "The {0} database does not exist on {1}.",
            publicationDb, publisherName));
    }

    // Set the required properties for the merge publication.
    publication = new MergePublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    // Enable precomputed partitions.
    publication.PartitionGroupsOption = PartitionGroupsOption.True;

    // Specify the Windows account under which the Snapshot Agent job runs.
    // This account will be used for the local connection to the 
    // Distributor and all agent connections that use Windows Authentication.
    publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
    publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;

    // Explicitly set the security mode for the Publisher connection
    // Windows Authentication (the default).
    publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;

    // Enable Subscribers to request snapshot generation and filtering.
    publication.Attributes |= PublicationAttributes.AllowSubscriberInitiatedSnapshot;
    publication.Attributes |= PublicationAttributes.DynamicFilters;

    // Enable pull and push subscriptions.
    publication.Attributes |= PublicationAttributes.AllowPull;
    publication.Attributes |= PublicationAttributes.AllowPush;

    if (!publication.IsExistingObject)
    {
        // Create the merge publication.
        publication.Create();
        
        // Create a Snapshot Agent job for the publication.
        publication.CreateSnapshotAgent();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The {0} publication already exists.", publicationName));
    }
}

catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "The publication {0} could not be created.", publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"

Dim publicationDb As ReplicationDatabase
Dim publication As MergePublication

' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)

Try
    ' Connect to the Publisher.
    conn.Connect()

    ' Enable the database for merge publication.				
    publicationDb = New ReplicationDatabase(publicationDbName, conn)
    If publicationDb.LoadProperties() Then
        If Not publicationDb.EnabledMergePublishing Then
            publicationDb.EnabledMergePublishing = True
        End If
    Else
        ' Do something here if the database does not exist. 
        Throw New ApplicationException(String.Format( _
         "The {0} database does not exist on {1}.", _
         publicationDb, publisherName))
    End If

    ' Set the required properties for the merge publication.
    publication = New MergePublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    ' Enable precomputed partitions.
    publication.PartitionGroupsOption = PartitionGroupsOption.True

    ' Specify the Windows account under which the Snapshot Agent job runs.
    ' This account will be used for the local connection to the 
    ' Distributor and all agent connections that use Windows Authentication.
    publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin
    publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword

    ' Explicitly set the security mode for the Publisher connection
    ' Windows Authentication (the default).
    publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = True

    ' Enable Subscribers to request snapshot generation and filtering.
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.AllowSubscriberInitiatedSnapshot
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.DynamicFilters

    ' Enable pull and push subscriptions
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.AllowPull
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.AllowPush

    If Not publication.IsExistingObject Then
        ' Create the merge publication.
        publication.Create()

        ' Create a Snapshot Agent job for the publication.
        publication.CreateSnapshotAgent()
    Else
        Throw New ApplicationException(String.Format( _
            "The {0} publication already exists.", publicationName))
    End If
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
        "The publication {0} could not be created.", publicationName), ex)
Finally
    conn.Disconnect()
End Try

En este ejemplo se crea manualmente la partición del suscriptor y la instantánea filtrada para una publicación de combinación con filtros de filas con parámetros.

// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
string distributorName = publisherInstance;

MergePublication publication;
MergePartition partition;
MergeDynamicSnapshotJob snapshotAgentJob;
ReplicationAgentSchedule schedule;

// Create a connection to the Publisher.
ServerConnection publisherConn = new ServerConnection(publisherName);

// Create a connection to the Distributor to start the Snapshot Agent.
ServerConnection distributorConn = new ServerConnection(distributorName);

try
{
    // Connect to the Publisher.
    publisherConn.Connect();

    // Set the required properties for the publication.
    publication = new MergePublication();
    publication.ConnectionContext = publisherConn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;


    // If we can't get the properties for this merge publication, 
    // then throw an application exception.
    if (publication.LoadProperties() || publication.SnapshotAvailable)
    {
        // Set a weekly schedule for the filtered data snapshot.
        schedule = new ReplicationAgentSchedule();
        schedule.FrequencyType = ScheduleFrequencyType.Weekly;
        schedule.FrequencyRecurrenceFactor = 1;
        schedule.FrequencyInterval = Convert.ToInt32(0x001);

        // Set the value of Hostname that defines the data partition. 
        partition = new MergePartition();
        partition.DynamicFilterHostName = hostname;
        snapshotAgentJob = new MergeDynamicSnapshotJob();
        snapshotAgentJob.DynamicFilterHostName = hostname;

        // Create the partition for the publication with the defined schedule.
        publication.AddMergePartition(partition);
        publication.AddMergeDynamicSnapshotJob(snapshotAgentJob, schedule);
    }
    else
    {
        throw new ApplicationException(String.Format(
            "Settings could not be retrieved for the publication, " +
            " or the initial snapshot has not been generated. " +
            "Ensure that the publication {0} exists on {1} and " +
            "that the Snapshot Agent has run successfully.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Do error handling here.
    throw new ApplicationException(string.Format(
        "The partition for '{0}' in the {1} publication could not be created.",
        hostname, publicationName), ex);
}
finally
{
    publisherConn.Disconnect();
    if (distributorConn.IsOpen) distributorConn.Disconnect();
}
' Define the server, database, and publication names
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim distributorName As String = publisherInstance

Dim publication As MergePublication
Dim partition As MergePartition
Dim snapshotAgentJob As MergeDynamicSnapshotJob
Dim schedule As ReplicationAgentSchedule

' Create a connection to the Publisher.
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)

' Create a connection to the Distributor to start the Snapshot Agent.
Dim distributorConn As ServerConnection = New ServerConnection(distributorName)

Try
    ' Connect to the Publisher.
    publisherConn.Connect()

    ' Set the required properties for the publication.
    publication = New MergePublication()
    publication.ConnectionContext = publisherConn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName


    ' If we can't get the properties for this merge publication, 
    ' then throw an application exception.
    If (publication.LoadProperties() Or publication.SnapshotAvailable) Then
        ' Set a weekly schedule for the filtered data snapshot.
        schedule = New ReplicationAgentSchedule()
        schedule.FrequencyType = ScheduleFrequencyType.Weekly
        schedule.FrequencyRecurrenceFactor = 1
        schedule.FrequencyInterval = Convert.ToInt32("0x001", 16)

        ' Set the value of Hostname that defines the data partition. 
        partition = New MergePartition()
        partition.DynamicFilterHostName = hostname
        snapshotAgentJob = New MergeDynamicSnapshotJob()
        snapshotAgentJob.DynamicFilterHostName = hostname

        ' Create the partition for the publication with the defined schedule.
        publication.AddMergePartition(partition)
        publication.AddMergeDynamicSnapshotJob(snapshotAgentJob, schedule)
    Else
        Throw New ApplicationException(String.Format( _
         "Settings could not be retrieved for the publication, " + _
         " or the initial snapshot has not been generated. " + _
         "Ensure that the publication {0} exists on {1} and " + _
         "that the Snapshot Agent has run successfully.", _
         publicationName, publisherName))
    End If
Catch ex As Exception
    ' Do error handling here.
    Throw New ApplicationException(String.Format( _
     "The partition for '{0}' in the {1} publication could not be created.", _
     hostname, publicationName), ex)
Finally
    publisherConn.Disconnect()
    If distributorConn.IsOpen Then
        distributorConn.Disconnect()
    End If
End Try

En este ejemplo se inicia manualmente el Agente de instantáneas para generar la instantánea de datos filtrados de un suscriptor para una publicación de combinación con filtros de filas con parámetros.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;
string distributorName = publisherInstance;

SnapshotGenerationAgent agent;

try
{
    // Set the required properties for Snapshot Agent.
    agent = new SnapshotGenerationAgent();
    agent.Distributor = distributorName;
    agent.DistributorSecurityMode = SecurityMode.Integrated;
    agent.Publisher = publisherName;
    agent.PublisherSecurityMode = SecurityMode.Integrated;
    agent.Publication = publicationName;
    agent.PublisherDatabase = publicationDbName;
    agent.ReplicationType = ReplicationType.Merge;

    // Specify the partition information to generate a 
    // filtered snapshot based on Hostname.
    agent.DynamicFilterHostName = hostname;

    // Start the agent synchronously.
    agent.GenerateSnapshot();
}
catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "A snapshot could not be generated for the {0} publication."
        , publicationName), ex);
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance
Dim distributorName As String = publisherInstance

Dim agent As SnapshotGenerationAgent

Try
    ' Set the required properties for Snapshot Agent.
    agent = New SnapshotGenerationAgent()
    agent.Distributor = distributorName
    agent.DistributorSecurityMode = SecurityMode.Integrated
    agent.Publisher = publisherName
    agent.PublisherSecurityMode = SecurityMode.Integrated
    agent.Publication = publicationName
    agent.PublisherDatabase = publicationDbName
    agent.ReplicationType = ReplicationType.Merge

    ' Specify the partition information to generate a 
    ' filtered snapshot based on Hostname.
    agent.DynamicFilterHostName = hostname

    ' Start the agent synchronously.
    agent.GenerateSnapshot()
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
     "A snapshot could not be generated for the {0} publication." _
     , publicationName), ex)
End Try

Consulte también

Filtros de fila con parámetros
Conceptos de procedimientos almacenados del sistema de replicación
Procedimientos recomendados de seguridad de replicación