Definir una relación de registros lógicos entre artículos de tabla de mezclaDefine a Logical Record Relationship Between Merge Table Articles

En este tema se describe cómo definir una relación de registros lógicos entre los artículos de tabla de mezcla en SQL Server 2017SQL Server 2017 mediante SQL Server Management StudioSQL Server Management Studio, Transact-SQLTransact-SQLo Replication Management Objects (RMO).This topic describes how to define a logical record relationship between merge table articles in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio, Transact-SQLTransact-SQL, or Replication Management Objects (RMO).

La replicación de mezcla le permite definir una relación entre filas relacionadas de tablas diferentes.Merge replication allows you to define a relationship between related rows in different tables. De ese modo, las filas se pueden procesar como una unidad transaccional durante la sincronización.These rows can then be processed as a transactional unit during synchronization. Se puede definir un registro lógico entre dos artículos independientemente de que tengan una relación de filtro de unión o no.A logical record can be defined between two articles whether or not they have a join filter relationship. Para obtener más información, vea Group Changes to Related Rows with Logical Records (Agrupar cambios en filas relacionadas con registros lógicos).For more information, see Group Changes to Related Rows with Logical Records.

Nota

Esta característica se quitará en una versión futura de Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

En este temaIn This Topic

Antes de comenzar Before You Begin

Limitaciones y restricciones Limitations and Restrictions

  • Si agrega, modifica o elimina un registro lógico una vez inicializadas las suscripciones a la publicación, deberá generar una instantánea nueva y reinicializar todas las suscripciones después de realizar el cambio.If you add, modify, or delete a logical record after subscriptions to the publication have been initialized, you must generate a new snapshot and reinitialize all subscriptions after making the change. Para obtener más información sobre los requisitos para los cambios de propiedad, consulte Change Publication and Article Properties (Cambiar las propiedades de la publicación y de los artículos).For more information about requirements for property changes, see Change Publication and Article Properties.

Usar SQL Server Management Studio Using SQL Server Management Studio

Defina registros lógicos en el cuadro de diálogo Agregar combinación, que está disponible en el Asistente para nueva publicación y en el cuadro de diálogo Propiedades de la publicación: <publicación>.Define logical records in the Add Join dialog box, which is available in the New Publication Wizard and the Publication Properties - <Publication> dialog box. Para obtener más información sobre el uso del asistente y el acceso al cuadro de diálogo, vea Crear una publicación y Ver y modificar propiedades de publicación.For more information about using the wizard and accessing the dialog box, see Create a Publication and View and Modify Publication Properties.

Los registros lógicos se pueden definir en el cuadro de diálogo Agregar combinación solamente si se aplican a un filtro de combinación en una publicación de combinación y la publicación cumple los requisitos para utilizar particiones precalculadas.Logical records can be defined in the Add Join dialog box only if they are applied to a join filter in a merge publication, and the publication follows the requirements for using precomputed partitions. Debe utilizar procedimientos almacenados para definir registros lógicos que no se aplican a los filtros de combinación y para establecer la detección y resolución de conflictos en el nivel de registro lógico.To define logical records that are not applied to join filters and to set conflict detection and resolution at the logical record level, you must use stored procedures.

Para definir una relación de registros lógicosTo define a logical record relationship

  1. En la página Filtrar filas de tabla del Asistente para nueva publicación o la página Filtrar filas del cuadro de diálogo Propiedades de la publicación: <publicación>, seleccione un filtro de fila en el panel Tablas filtradas.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication> dialog box, select a row filter in the Filtered Tables pane.

    Una relación de registros lógicos está asociada con un filtro de combinación, que amplía un filtro de fila.A logical record relationship is associated with a join filter, which extends a row filter. Por tanto, debe definir un filtro de fila antes de poder ampliar el filtro con una combinación y aplicar una relación de registros lógicos.Therefore you must define a row filter before you can extend the filter with a join and apply a logical record relationship. Una vez definido el filtro de combinación, podrá ampliarlo con otro filtro de combinación.After one join filter is defined, you can extend this join filter with another join filter. Para obtener más información acerca de cómo definir filtros de combinación, vea Define and Modify a Join Filter Between Merge Articles.For more information about defining join filters, see Define and Modify a Join Filter Between Merge Articles.

  2. Haga clic en Agregary, a continuación, en Agregar combinación para ampliar el filtro seleccionado.Click Add, and then click Add Join to Extend the Selected Filter.

  3. Defina el filtro de combinación en el cuadro de diálogo Agregar combinación y, a continuación, active la casilla Registro lógico.Define a join filter in the Add Join dialog box, and then select the check box Logical Record.

  4. Si se encuentra en el cuadro de diálogo Propiedades de la publicación: <publicación>, haga clic en Aceptar para guardar y cerrar el cuadro de diálogo.If you are in the Publication Properties - <Publication> dialog box, click OK to save and close the dialog box.

Para eliminar una relación de registros lógicosTo delete a logical record relationship

  • Elimine solamente la relación de registros lógicos o elimine la relación de registros lógicos y el filtro de combinación asociado a la misma.Delete only the logical record relationship or delete the logical record relationship and the join filter associated with it.

    Para eliminar solamente la relación de registros lógicos:To delete only the logical record relationship:

    1. En la página Filtrar filas del Asistente para nueva publicación o en la página Filtrar filas del cuadro de diálogo Propiedades de la publicación: <publicación>, seleccione el filtro de combinación asociado con la relación de registros lógicos del panel Tablas filtradas y luego haga clic en Editar.On the Filter Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication> dialog box, select the join filter associated with the logical record relationship in the Filtered Tables pane, and then click Edit.

    2. En el cuadro de diálogo Editar combinación , desactive la casilla Registro lógico.In the Edit Join dialog box, clear the check box Logical Record.

    3. Haga clic en Aceptar.Click OK.

      Para eliminar la relación de registros lógicos y el filtro de combinación asociado a la misma:To delete the logical record relationship and join filter associated with it:

    • En la página Filtrar filas del Asistente para nueva publicación o en el cuadro de diálogo Propiedades de la publicación: <publicación>, seleccione un filtro en el panel Tablas filtradas y haga clic en Eliminar.On the Filter Rows page of the New Publication Wizard or Publication Properties - <Publication> dialog box, select a filter in the Filtered Tables pane, and then click Delete. Si el filtro de combinación que elimina está a su vez ampliado por otras combinaciones, esas combinaciones también se eliminarán.If the join filter you delete is itself extended by other joins, those joins will also be deleted.

Usar Transact-SQL Using Transact-SQL

Puede especificar mediante programación las relaciones de registros lógicos entre los artículos usando procedimientos almacenados de replicación.You can programmatically specify logical record relationships between articles using replication stored procedures.

Para definir una relación de registros lógicos sin un filtro de combinación asociadoTo define a logical record relationship without an associated join filter

  1. Si la publicación contiene cualquier artículo que se filtra, ejecute sp_helpmergepublicationy tenga en cuenta el valor de use_partition_groups en el conjunto de resultados.If the publication contains any articles that are filtered, execute sp_helpmergepublication, and note the value of use_partition_groups in the result set.

    • Si el valor es 1, las particiones precalculadas ya se están usando.If the value is 1, then precomputed partitions are already being used.

    • Si el valor es 0, ejecute sp_changemergepublication en el Publicador de la base de datos de publicación.If the value is 0, then execute sp_changemergepublication at the Publisher on the publication database. Especifique un valor de use_partition_groups para @property y un valor de true para @value.Specify a value of use_partition_groups for @property and a value of true for @value.

      Nota

      Si la publicación no admite las particiones precalculadas, no se pueden usar registros lógicos.If the publication does not support precomputed partitions, then logical records cannot be used. Para obtener más información, vea la sección Requisitos para utilizar particiones precalculadas de Optimizar el rendimiento de los filtros con parámetros con particiones calculadas previamente.For more information, see Requirements for Using Precomputed Partitions in the topic Optimize Parameterized Filter Performance with Precomputed Partitions.

    • Si el valor es NULL, el Agente de instantáneas tiene que seguir ejecutándose para generar la instantánea inicial para la publicación.If the value is NULL, then the Snapshot Agent needs to be run to generate the initial snapshot for the publication.

  2. Si no existen los artículos que comprenderán el registro lógico, ejecute sp_addmergearticle en el Publicador de la base de datos de publicación.If the articles that will comprise the logical record do not exist, execute sp_addmergearticle at the Publisher on the publication database. Especifique una de las siguientes opciones de detección y resolución de conflictos para el registro lógico:Specify one of the following conflict detection and resolution options for the logical record:

    • Para detectar y solucionar conflictos que se producen dentro de las filas relacionadas en el registro lógico, especifique un valor de true para @logical_record_level_conflict_detection y @logical_record_level_conflict_resolution.To detect and resolve conflicts that occur within related rows in the logic record, specify a value of true for @logical_record_level_conflict_detection and @logical_record_level_conflict_resolution.

    • Para usar la resolución y detección de conflictos en el nivel de filas o columnas, especifique un valor de false para @logical_record_level_conflict_detection y @logical_record_level_conflict_resolution, que es el valor predeterminado.To use the standard row- or column-level conflict detection and resolution, specify a value of false for @logical_record_level_conflict_detection and @logical_record_level_conflict_resolution, which is the default.

  3. Repita el paso 2 para cada artículo que comprenderá el registro lógico.Repeat step 2 for each article that will comprise the logical record. Debe usar la misma opción de detección y resolución de conflictos para cada artículo del registro lógico.You must use the same conflict detection and resolution option for each article in the logical record. Para más información, consulte Detecting and Resolving Conflicts in Logical Records.For more information, see Detecting and Resolving Conflicts in Logical Records.

  4. En la base de datos de publicación del publicador, ejecute sp_addmergefilter.At the publisher on the publication database, execute sp_addmergefilter. Especifique @publication, el nombre de un artículo en la relación para @article, el nombre del segundo artículo para @join_articlename, un nombre para la relación para @filtername, una cláusula que define la relación entre los dos artículos para @join_filterclause, el tipo de combinación para @join_unique_key y uno de los valores siguientes para @filter_type:Specify @publication, the name of one article in the relationship for @article, the name of the second article for @join_articlename, a name for the relationship for @filtername, a clause that defines the relationship between the two articles for @join_filterclause, the type of join for @join_unique_key and one of the following values for @filter_type:

    • 2 : define una relación lógica.2 - Defines a logical relationship.

    • 3 : define una relación lógica con un filtro de combinación.3 - Defines a logical relationship with a join filter.

    Nota

    Si no se usa un filtro de combinación, la dirección de la relación entre los dos artículos no es importante.If a join filter is not used, the direction of the relationship between the two articles is not important.

  5. Repita el paso 2 para cada una de las demás relaciones de registros lógicos de la publicación.Repeat step 2 for each remaining logical record relationship in the publication.

Para cambiar la detección y resolución de conflictos para los registros lógicosTo change conflict detection and resolution for logical records

  1. Para detectar y solucionar conflictos que se producen dentro de las filas relacionadas en el registro lógico:To detect and resolve conflicts that occur within related rows in the logical record:

    • En la base de datos de publicación del publicador, ejecute sp_changemergearticle.At the Publisher on the publication database, execute sp_changemergearticle. Especifique un valor de logical_record_level_conflict_detection para @property y un valor de true para @value.Specify a value of logical_record_level_conflict_detection for @property and a value of true for @value. Especifique un valor de 1 para @force_invalidate_snapshot y @force_reinit_subscription.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

    • En la base de datos de publicación del publicador, ejecute sp_changemergearticle.At the Publisher on the publication database, execute sp_changemergearticle. Especifique un valor de logical_record_level_conflict_resolution para @property y un valor de true para @value.Specify a value of logical_record_level_conflict_resolution for @property and a value of true for @value. Especifique un valor de 1 para @force_invalidate_snapshot y @force_reinit_subscription.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

  2. Para usar la detección y resolución de conflictos de nivel de columna y de fila estándar:To use the standard row-level or column-level conflict detection and resolution:

    • En la base de datos de publicación del publicador, ejecute sp_changemergearticle.At the Publisher on the publication database, execute sp_changemergearticle. Especifique un valor de logical_record_level_conflict_detection para @property y un valor de false para @value.Specify a value of logical_record_level_conflict_detection for @property and a value of false for @value. Especifique un valor de 1 para @force_invalidate_snapshot y @force_reinit_subscription.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

    • En la base de datos de publicación del publicador, ejecute sp_changemergearticle.At the Publisher on the publication database, execute sp_changemergearticle. Especifique un valor de logical_record_level_conflict_resolution para @property y un valor de false para @value.Specify a value of logical_record_level_conflict_resolution for @property and a value of false for @value. Especifique un valor de 1 para @force_invalidate_snapshot y @force_reinit_subscription.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

Para quitar una relación de registros lógicosTo remove a logical record relationship

  1. En el Publicador de la base de datos de publicación, ejecute la consulta siguiente para devolver información sobre todas las relaciones de registros lógicos definidas para la publicación especificada:At the Publisher on the publication database, execute the following query to return information about all logical record relationships defined for the specified publication:

    SELECT f.* FROM sysmergesubsetfilters AS f 
    INNER JOIN sysmergepublications AS p
    ON f.pubid = p.pubid WHERE p.[name] = @publication;
    

    Tenga en cuenta el nombre de la relación de registros lógicos que se está quitando en la columna filtername del conjunto de resultados.Note the name of the logical record relationship being removed in the filtername column in the result set.

    Nota

    Esta consulta devuelve la misma información que sp_helpmergefilter; sin embargo, este procedimiento almacenado del sistema solamente devuelve información sobre las relaciones de registros lógicos que también son filtros de combinación.This query returns the same information as sp_helpmergefilter; however, this system stored procedure only returns information about logical record relationships that are also join filters.

  2. En la base de datos de publicación del publicador, ejecute sp_dropmergefilter.At the Publisher on the publication database, execute sp_dropmergefilter. Especifique @publication, el nombre de uno de los artículos en la relación para @articley el nombre de la relación del paso 1 para @filtername.Specify @publication, the name of one of the articles in the relationship for @article, and the name of the relationship from step 1 for @filtername.

Ejemplo (Transact-SQL) Example (Transact-SQL)

En este ejemplo se habilitan las particiones calculadas previamente en una publicación existente y se crea un registro lógico que comprende los dos artículos nuevos para las tablas SalesOrderHeader y SalesOrderDetail .This example enables precomputed partitions on an existing publication, and creates a logical record comprising the two new articles for the SalesOrderHeader and SalesOrderDetail tables.

-- Remove ON DELETE CASCADE from FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID;
-- logical records cannot be used with ON DELETE CASCADE. 
IF EXISTS (SELECT * FROM sys.objects 
WHERE name = 'FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID')
BEGIN
	ALTER TABLE [Sales].[SalesOrderDetail] 
	DROP CONSTRAINT [FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID] 
END

ALTER TABLE [Sales].[SalesOrderDetail]  
WITH CHECK ADD CONSTRAINT [FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID] 
FOREIGN KEY([SalesOrderID])
REFERENCES [Sales].[SalesOrderHeader] ([SalesOrderID])
GO

DECLARE @publication    AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @table3 AS sysname;
DECLARE @salesschema AS sysname;
DECLARE @hrschema AS sysname;
DECLARE @filterclause AS nvarchar(1000);
DECLARE @partitionoption AS bit;
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @table1 = N'SalesOrderDetail'; 
SET @table2 = N'SalesOrderHeader'; 
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';

-- Ensure that the publication uses precomputed partitions.
SET @partitionoption = (SELECT [use_partition_groups] FROM sysmergepublications 
	WHERE [name] = @publication);
IF @partitionoption <> 1
BEGIN
	EXEC sp_changemergepublication 
		@publication = @publication, 
		@property = N'use_partition_groups', 
		@value = 'true',
		@force_invalidate_snapshot = 1;
END  

-- Add a filtered article for the Employee table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_object = @table1, 
  @type = N'table', 
  @source_owner = @hrschema,
  @schema_option = 0x0004CF1,
  @description = N'article for the Employee table',
  @subset_filterclause = @filterclause;

-- Add an article for the SalesOrderHeader table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_object = @table2, 
  @type = N'table', 
  @source_owner = @salesschema,
  @schema_option = 0x0034EF1,
  @description = N'article for the SalesOrderHeader table';

-- Add an article for the SalesOrderDetail table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table3, 
  @source_object = @table3, 
  @source_owner = @salesschema,
  @description = 'article for the SalesOrderDetail table', 
  @identityrangemanagementoption = N'auto', 
  @pub_identity_range = 100000, 
  @identity_range = 100, 
  @threshold = 80;

-- Add a merge join filter between Employee and SalesOrderHeader.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table2, 
  @filtername = N'SalesOrderHeader_Employee', 
  @join_articlename = @table1, 
  @join_filterclause = N'Employee.EmployeeID = SalesOrderHeader.SalesPersonID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Create a logical record relationship that is also a merge join 
-- filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table3, 
  @filtername = N'LogicalRecord_SalesOrderHeader_SalesOrderDetail', 
  @join_articlename = @table2, 
  @join_filterclause = N'[SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]', 
  @join_unique_key = 1, 
  @filter_type = 3, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;
GO

Usar Replication Management Objects (RMO) Using Replication Management Objects (RMO)

Nota

La replicación de mezcla le permite especificar que se realice un seguimiento de los conflictos y se resuelvan en el nivel de registro lógico, pero dichas opciones no se pueden establecer usando RMO.Merge replication allows you to specify that conflicts be tracked and resolved at the logical record level, but these options cannot be set using RMO.

Para definir una relación de registros lógicos sin un filtro de combinación asociadoTo define a logical record relationship without an associated join filter

  1. Cree una conexión al publicador mediante la clase ServerConnection.Create a connection to the Publisher by using the ServerConnection class.

  2. Cree una instancia de la clase MergePublication, establezca las propiedades Name y DatabaseName para la publicación y establezca la propiedad ConnectionContext en la conexión creada en el paso 1.Create an instance of the MergePublication class, set the Name and DatabaseName properties for the publication, and set the ConnectionContext property to the connection created in step 1.

  3. Llame al método LoadProperties para obtener las propiedades del objeto.Call the LoadProperties method to get the properties of the object. Si este método devuelve false, significa que las propiedades de publicación del paso 2 se definieron incorrectamente, o bien que la publicación no existe.If this method returns false, either the publication properties in step 2 were defined incorrectly or the publication does not exist.

  4. Si la propiedad PartitionGroupsOption está establecida en False, cámbiela a True.If the PartitionGroupsOption property is set to False, set it to True.

  5. Si los artículos que van a componer el registro lógico no existen, cree una instancia de la clase MergeArticle y establezca las propiedades siguientes:If the articles that are to comprise the logical record do not exist, create an instance of the MergeArticle class, and set the following properties:

    • El nombre del artículo para Name.The name of the article for Name.

    • El nombre de la publicación para PublicationName.The name of the publication for PublicationName.

    • (Opcional) Si se filtra el artículo horizontalmente, especifique la cláusula de filtro de filas para la propiedad FilterClause.(Optional) If the article is horizontally filtered, specify the row filter clause for the FilterClause property. Utilice esta propiedad para especificar un filtro de fila estático o con parámetros.Use this property to specify a static or parameterized row filter. Para más información, consulte Parameterized Row Filters.For more information, see Parameterized Row Filters.

      Para más información, consulte Define an Article.For more information, see Define an Article.

  6. Llame al método Create.Call the Create method.

  7. Repita los pasos 5 y 6 para cada artículo que comprende el registro lógico.Repeat steps 5 and 6 for each article comprising the logical record.

  8. Cree una instancia de la clase MergeJoinFilter para definir la relación de registros lógicos entre los artículos.Create an instance of the MergeJoinFilter class to define the logical record relationship between articles. A continuación, establezca las siguientes propiedades:Then, set the following properties:

  9. Llame al método AddMergeJoinFilter en el objeto que representa el artículo secundario en la relación.Call the AddMergeJoinFilter method on the object that represents the child article in the relationship. Pase el objeto MergeJoinFilter del paso 8 para definir la relación.Pass the MergeJoinFilter object from step 8 to define the relationship.

  10. Repita los pasos 8 y 9 para cada una de las demás relaciones de registros lógicos de la publicación.Repeat steps 8 and 9 for each remaining logical record relationship in the publication.

Ejemplo (RMO) Example (RMO)

En este ejemplo se crea un registro lógico que incluye los dos artículos nuevos para las tablas SalesOrderHeader y SalesOrderDetail .This example creates a logical record comprising the two new articles for the SalesOrderHeader and SalesOrderDetail tables.

// Define the Publisher and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2012";

// Specify article names.
string articleName1 = "SalesOrderHeader";
string articleName2 = "SalesOrderDetail";

// Specify logical record information.
string lrName = "SalesOrderHeader_SalesOrderDetail";
string lrClause = "[SalesOrderHeader].[SalesOrderID] = "
    + "[SalesOrderDetail].[SalesOrderID]";

string schema = "Sales";

MergeArticle article1 = new MergeArticle();
MergeArticle article2 = new MergeArticle();
MergeJoinFilter lr = new MergeJoinFilter();
MergePublication publication = new MergePublication();

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

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

    // Verify that the publication uses precomputed partitions.
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;
    publication.ConnectionContext = conn;

    // If we can't get the properties for this merge publication, then throw an application exception.
    if (publication.LoadProperties())
    {
        // If precomputed partitions is disabled, enable it.
        if (publication.PartitionGroupsOption == PartitionGroupsOption.False)
        {
            publication.PartitionGroupsOption = PartitionGroupsOption.True;
        }
    }
    else
    {
        throw new ApplicationException(String.Format(
            "Settings could not be retrieved for the publication. " +
            "Ensure that the publication {0} exists on {1}.",
            publicationName, publisherName));
    }

    // Set the required properties for the PurchaseOrderHeader article.
    article1.ConnectionContext = conn;
    article1.Name = articleName1;
    article1.DatabaseName = publicationDbName;
    article1.SourceObjectName = articleName1;
    article1.SourceObjectOwner = schema;
    article1.PublicationName = publicationName;
    article1.Type = ArticleOptions.TableBased;

    // Set the required properties for the SalesOrderDetail article.
    article2.ConnectionContext = conn;
    article2.Name = articleName2;
    article2.DatabaseName = publicationDbName;
    article2.SourceObjectName = articleName2;
    article2.SourceObjectOwner = schema;
    article2.PublicationName = publicationName;
    article2.Type = ArticleOptions.TableBased;

    if (!article1.IsExistingObject) article1.Create();
    if (!article2.IsExistingObject) article2.Create();

    // Define a logical record relationship between 
    // PurchaseOrderHeader and PurchaseOrderDetail. 

    // Parent article.
    lr.JoinArticleName = articleName1;
    
    // Child article.
    lr.ArticleName = articleName2;
    lr.FilterName = lrName;
    lr.JoinUniqueKey = true;
    lr.FilterTypes = FilterTypes.LogicalRecordLink;
    lr.JoinFilterClause = lrClause;

    // Add the logical record definition to the parent article.
    article1.AddMergeJoinFilter(lr);
}
catch (Exception ex)
{
    // Do error handling here and rollback the transaction.
    throw new ApplicationException(
        "The filtered articles could not be created", ex);
}
finally
{
    conn.Disconnect();
}
' Define the Publisher and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2012"

' Specify article names.
Dim articleName1 As String = "SalesOrderHeader"
Dim articleName2 As String = "SalesOrderDetail"

' Specify logical record information.
Dim lrName As String = "SalesOrderHeader_SalesOrderDetail"
Dim lrClause As String = "[SalesOrderHeader].[SalesOrderID] = " _
        & "[SalesOrderDetail].[SalesOrderID]"

Dim schema As String = "Sales"

Dim article1 As MergeArticle = New MergeArticle()
Dim article2 As MergeArticle = New MergeArticle()
Dim lr As MergeJoinFilter = New MergeJoinFilter()
Dim publication As MergePublication = New MergePublication()

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

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

    ' Verify that the publication uses precomputed partitions.
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName
    publication.ConnectionContext = conn

    ' If we can't get the properties for this merge publication, then throw an application exception.
    If publication.LoadProperties() Then
        ' If precomputed partitions is disabled, enable it.
        If publication.PartitionGroupsOption = PartitionGroupsOption.False Then
            publication.PartitionGroupsOption = PartitionGroupsOption.True
        End If
    Else
        Throw New ApplicationException(String.Format( _
            "Settings could not be retrieved for the publication. " _
            & "Ensure that the publication {0} exists on {1}.", _
            publicationName, publisherName))
    End If

    ' Set the required properties for the SalesOrderHeader article.
    article1.ConnectionContext = conn
    article1.Name = articleName1
    article1.DatabaseName = publicationDbName
    article1.SourceObjectName = articleName1
    article1.SourceObjectOwner = schema
    article1.PublicationName = publicationName
    article1.Type = ArticleOptions.TableBased

    ' Set the required properties for the SalesOrderDetail article.
    article2.ConnectionContext = conn
    article2.Name = articleName2
    article2.DatabaseName = publicationDbName
    article2.SourceObjectName = articleName2
    article2.SourceObjectOwner = schema
    article2.PublicationName = publicationName
    article2.Type = ArticleOptions.TableBased

    If Not article1.IsExistingObject Then
        article1.Create()
    End If
    If Not article2.IsExistingObject Then
        article2.Create()
    End If

    ' Define a logical record relationship between 
    ' SalesOrderHeader and SalesOrderDetail. 

    ' Parent article.
    lr.JoinArticleName = articleName1
    ' Child article.
    lr.ArticleName = articleName2
    lr.FilterName = lrName
    lr.JoinUniqueKey = True
    lr.FilterTypes = FilterTypes.LogicalRecordLink
    lr.JoinFilterClause = lrClause

    ' Add the logical record definition to the parent article.
    article1.AddMergeJoinFilter(lr)
Catch ex As Exception
    ' Do error handling here and rollback the transaction.
    Throw New ApplicationException( _
            "The filtered articles could not be created", ex)
Finally
    conn.Disconnect()
End Try

Vea tambiénSee Also

Define and Modify a Join Filter Between Merge Articles Define and Modify a Join Filter Between Merge Articles
Definición y modificación de un filtro de fila con parámetros para un artículo de mezcla Define and Modify a Parameterized Row Filter for a Merge Article
Definir y modificar un filtro de fila estático Define and Modify a Static Row Filter
Agrupar cambios en filas relacionadas con registros lógicos Group Changes to Related Rows with Logical Records
Optimizar el rendimiento de los filtros con parámetros con particiones calculadas previamente Optimize Parameterized Filter Performance with Precomputed Partitions
Agrupar cambios en filas relacionadas con registros lógicos Group Changes to Related Rows with Logical Records