Definizione di una relazione tra record logici degli articoli di tabelle di mergeDefine a Logical Record Relationship Between Merge Table Articles

In questo argomento viene descritto come definire una relazione tra record logici tra articoli di tabella del merge in SQL Server 2017SQL Server 2017 tramite SQL Server Management StudioSQL Server Management Studio, Transact-SQLTransact-SQLo RMO (Replication Management Objects).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 replica di tipo merge consente di definire una relazione tra righe correlate in tabelle diverse.Merge replication allows you to define a relationship between related rows in different tables. Queste righe possono quindi essere elaborate come un'unità transazionale durante la sincronizzazione.These rows can then be processed as a transactional unit during synchronization. È possibile definire un record logico tra due articoli indipendentemente dal fatto che per essi sia stata definita una relazione tra filtri di join.A logical record can be defined between two articles whether or not they have a join filter relationship. Per altre informazioni, vedere Raggruppare modifiche alle righe correlate con record logici.For more information, see Group Changes to Related Rows with Logical Records.

Nota

Questa funzionalità verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Contenuto dell'argomentoIn This Topic

Prima di iniziare Before You Begin

Limitazioni e restrizioni Limitations and Restrictions

  • Se si aggiunge, modifica o elimina un record logico dopo che sono state inizializzate sottoscrizioni per la pubblicazione, è necessario generare un nuovo snapshot e reinizializzare tutte le sottoscrizioni in seguito alla modifica.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. Per altre informazioni sui requisiti per la modifica delle proprietà, vedere Modificare le proprietà di pubblicazioni e articoli.For more information about requirements for property changes, see Change Publication and Article Properties.

Utilizzo di SQL Server Management Studio Using SQL Server Management Studio

Definire record logici nella finestra di dialogo Aggiungi join disponibile nella Creazione guidata nuova pubblicazione e nella finestra di dialogo Proprietà pubblicazione - <Pubblicazione>.Define logical records in the Add Join dialog box, which is available in the New Publication Wizard and the Publication Properties - <Publication> dialog box. Per altre informazioni sull'uso della creazione guidata e l'accesso alla finestra di dialogo, vedere Creare una pubblicazione e Visualizzare e modificare le proprietà della pubblicazione.For more information about using the wizard and accessing the dialog box, see Create a Publication and View and Modify Publication Properties.

È possibile definire record logici nella finestra di dialogo Aggiungi join solo se vengono applicati a un filtro join di una pubblicazione di tipo merge e la pubblicazione soddisfa i requisiti per l'utilizzo di partizioni pre-calcolate.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. Per definire record logici che non vengono applicati a filtri di join e per impostare il rilevamento e la risoluzione dei conflitti a livello di record logici, è necessario utilizzare le stored procedure.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.

Per definire una relazione tra record logiciTo define a logical record relationship

  1. Nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtro righe della finestra di dialogo Proprietà pubblicazione - <Pubblicazione> selezionare un filtro di riga nel riquadro Tabelle filtrate.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.

    A una relazione tra record logici è associato un filtro join che estende un filtro di riga.A logical record relationship is associated with a join filter, which extends a row filter. È pertanto necessario definire un filtro di riga prima di poter estendere il filtro con un join e applicare una relazione tra record logici.Therefore you must define a row filter before you can extend the filter with a join and apply a logical record relationship. Dopo aver definito un filtro join, è possibile estenderlo con un altro filtro join.After one join filter is defined, you can extend this join filter with another join filter. Per ulteriori informazioni sulla definizione di filtri join, vedere 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. Fare clic su Aggiungie quindi su Aggiungi join per estendere il filtro selezionato.Click Add, and then click Add Join to Extend the Selected Filter.

  3. Nella finestra di dialogo Aggiungi join definire un filtro join e quindi selezionare la casella di controllo Record logico.Define a join filter in the Add Join dialog box, and then select the check box Logical Record.

  4. Se è visualizzata la finestra di dialogo Proprietà pubblicazione - <Pubblicazione> fare clic su OK per salvare e chiudere la finestra di dialogo.If you are in the Publication Properties - <Publication> dialog box, click OK to save and close the dialog box.

Per eliminare una relazione tra record logiciTo delete a logical record relationship

  • Eliminare solo la relazione tra record logici oppure eliminare la relazione e il filtro join ad essa associato.Delete only the logical record relationship or delete the logical record relationship and the join filter associated with it.

    Per eliminare solo la relazione tra record logici:To delete only the logical record relationship:

    1. Nella pagina Filtro righe della Creazione guidata nuova pubblicazione o nella pagina Filtro righe della finestra di dialogo Proprietà pubblicazione - <Pubblicazione> selezionare il filtro join associato alla relazione tra record logici nel riquadro Tabelle filtrate e quindi fare clic su Modifica.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. Nella finestra di dialogo Modifica join deselezionare la casella di controllo Record logico.In the Edit Join dialog box, clear the check box Logical Record.

    3. Fare clic su OK.Click OK.

      Per eliminare la relazione tra record logici e il filtro join ad essa associato:To delete the logical record relationship and join filter associated with it:

    • Nella pagina Filtro righe della Creazione guidata nuova pubblicazione o nella finestra di dialogo Proprietà pubblicazione - <Pubblicazione> selezionare un filtro nel riquadro Tabelle filtrate e quindi fare clic su Elimina.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. Se il filtro di join eliminato è esteso da altri join, anch'essi verranno eliminati.If the join filter you delete is itself extended by other joins, those joins will also be deleted.

Utilizzo di Transact-SQL Using Transact-SQL

Per specificare a livello di programmazione relazioni tra record logici tra gli articoli, è possibile utilizzare stored procedure di replica.You can programmatically specify logical record relationships between articles using replication stored procedures.

Per definire una relazione tra record logici senza un filtro di join associatoTo define a logical record relationship without an associated join filter

  1. Se la pubblicazione contiene eventuali articoli con filtro, eseguire sp_helpmergepublicatione notare il valore di use_partition_groups nel set di risultati.If the publication contains any articles that are filtered, execute sp_helpmergepublication, and note the value of use_partition_groups in the result set.

    • Se il valore è 1, le partizioni calcolate vengono già utilizzate.If the value is 1, then precomputed partitions are already being used.

    • Se il valore è 0, eseguire sp_changemergepublication nel database di pubblicazione del server di pubblicazione.If the value is 0, then execute sp_changemergepublication at the Publisher on the publication database. Specificare il valore use_partition_groups per @property e il valore true per @value.Specify a value of use_partition_groups for @property and a value of true for @value.

      Nota

      Se la pubblicazione non supporta le partizioni calcolate, non sarà possibile utilizzare i record logici.If the publication does not support precomputed partitions, then logical records cannot be used. Per altre informazioni vedere "Requisiti per l'uso delle partizioni pre-calcolate" nell'argomento Ottimizzare le prestazioni dei filtri con parametri con le partizioni pre-calcolate.For more information, see Requirements for Using Precomputed Partitions in the topic Optimize Parameterized Filter Performance with Precomputed Partitions.

    • Se il valore è NULL, è necessario eseguire l'agente snapshot per generare lo snapshot iniziale per la pubblicazione.If the value is NULL, then the Snapshot Agent needs to be run to generate the initial snapshot for the publication.

  2. Se gli articoli che includeranno il record logico non esistono, eseguire sp_addmergearticle nel database di pubblicazione del server di pubblicazione.If the articles that will comprise the logical record do not exist, execute sp_addmergearticle at the Publisher on the publication database. Specificare una delle opzioni di rilevamento e risoluzione dei conflitti seguenti per il record logico:Specify one of the following conflict detection and resolution options for the logical record:

    • Per rilevare e risolvere conflitti che si verificano all'interno di righe correlate del record logico, specificare il valore true per @logical_record_level_conflict_detection e @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.

    • Per utilizzare l'opzione riga di rilevamento e risoluzione dei conflitti a livello di riga o di colonna, specificare il valore false per @logical_record_level_conflict_detection e @logical_record_level_conflict_resolution, che corrisponde all'impostazione predefinita.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. Ripetere il passaggio 2 per ogni articolo che includerà il record logico.Repeat step 2 for each article that will comprise the logical record. È necessario utilizzare la stessa opzione di rilevamento e risoluzione dei conflitti per ogni articolo del record logico.You must use the same conflict detection and resolution option for each article in the logical record. Per altre informazioni, vedere Detecting and Resolving Conflicts in Logical Records.For more information, see Detecting and Resolving Conflicts in Logical Records.

  4. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergefilter.At the publisher on the publication database, execute sp_addmergefilter. Specificare @publication, il nome di un articolo della relazione per @article, il nome del secondo articolo per @join_articlename, un nome per la relazione per @filtername, una clausola che definisce la relazione tra i due articoli @join_filterclause, il tipo di join per @join_unique_key e uno dei valori seguenti per @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 : consente di definire una relazione logica.2 - Defines a logical relationship.

    • 3 : consente di definire una relazione logica con un filtro join.3 - Defines a logical relationship with a join filter.

    Nota

    Se il filtro join non viene utilizzato, la direzione della relazione tra i due articoli non ha rilevanza.If a join filter is not used, the direction of the relationship between the two articles is not important.

  5. Ripetere il passaggio 2 per tutte le altre relazioni tra record logici incluse nella pubblicazione.Repeat step 2 for each remaining logical record relationship in the publication.

Per modificare l'opzione di rilevamento e risoluzione dei conflitti per i record logiciTo change conflict detection and resolution for logical records

  1. Per rilevare e risolvere conflitti che si verificano all'interno di righe correlate nel record logico:To detect and resolve conflicts that occur within related rows in the logical record:

    • Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergearticle.At the Publisher on the publication database, execute sp_changemergearticle. Specificare il valore logical_record_level_conflict_detection per @property e il valore true per @value.Specify a value of logical_record_level_conflict_detection for @property and a value of true for @value. Specificare il valore 1 per @force_invalidate_snapshot e @force_reinit_subscription.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

    • Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergearticle.At the Publisher on the publication database, execute sp_changemergearticle. Specificare il valore logical_record_level_conflict_resolution per @property e il valore true per @value.Specify a value of logical_record_level_conflict_resolution for @property and a value of true for @value. Specificare il valore 1 per @force_invalidate_snapshot e @force_reinit_subscription.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

  2. Per utilizzare l'opzione standard di rilevamento e risoluzione dei conflitti a livello di riga o di colonna:To use the standard row-level or column-level conflict detection and resolution:

    • Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergearticle.At the Publisher on the publication database, execute sp_changemergearticle. Specificare il valore logical_record_level_conflict_detection per @property e il valore false per @value.Specify a value of logical_record_level_conflict_detection for @property and a value of false for @value. Specificare il valore 1 per @force_invalidate_snapshot e @force_reinit_subscription.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

    • Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergearticle.At the Publisher on the publication database, execute sp_changemergearticle. Specificare il valore logical_record_level_conflict_resolution per @property e il valore false per @value.Specify a value of logical_record_level_conflict_resolution for @property and a value of false for @value. Specificare il valore 1 per @force_invalidate_snapshot e @force_reinit_subscription.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

Per rimuovere una relazione tra record logiciTo remove a logical record relationship

  1. Nel database di pubblicazione del server di pubblicazione eseguire la query seguente per restituire informazioni su tutte le relazioni tra record logici definite per la pubblicazione specificata: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;
    

    Si noti il nome della relazione tra record logici da rimuovere nella colonna filtername del set di risultati.Note the name of the logical record relationship being removed in the filtername column in the result set.

    Nota

    Questa query restituisce le stesse informazioni di sp_helpmergefilter. La stored procedure di sistema restituisce tuttavia solo le informazioni sulle relazioni tra record logici che corrispondono anche a filtri join.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. Nel database di pubblicazione del server di pubblicazione eseguire sp_dropmergefilter.At the Publisher on the publication database, execute sp_dropmergefilter. Specificare @publication, il nome di uno degli articoli della relazione per @articlee il nome della relazione ottenuto al passaggio 1 per @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.

Esempio (Transact-SQL) Example (Transact-SQL)

In questo esempio le partizioni pre-calcolate vengono abilitate in una pubblicazione esistente e viene creato un record logico che comprende i due nuovi articoli per le tabelle SalesOrderHeader e 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

Utilizzo di RMO (Replication Management Objects) Using Replication Management Objects (RMO)

Nota

La replica di tipo merge consente di specificare che i conflitti vengano rilevati e risolti a livello di record logico. Queste opzioni tuttavia non possono essere impostate tramite 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.

Per definire una relazione tra record logici senza un filtro di join associatoTo define a logical record relationship without an associated join filter

  1. Creare una connessione al server di pubblicazione tramite la classe ServerConnection.Create a connection to the Publisher by using the ServerConnection class.

  2. Creare un'istanza della classe MergePublication, impostare le proprietà Name e DatabaseName per la pubblicazione, quindi impostare la proprietà ConnectionContext sulla connessione creata al passaggio 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. Chiamare il metodo LoadProperties per recuperare le proprietà dell'oggetto.Call the LoadProperties method to get the properties of the object. Se questo metodo restituisce false, le proprietà della pubblicazione sono state definite in modo non corretto nel passaggio 2 oppure la pubblicazione non esiste.If this method returns false, either the publication properties in step 2 were defined incorrectly or the publication does not exist.

  4. Se la proprietà PartitionGroupsOption è impostata su False, impostarla su True.If the PartitionGroupsOption property is set to False, set it to True.

  5. Se gli articoli che dovranno includere il record logico non esistono, creare un'istanza della classe MergeArticle e impostare le proprietà seguenti: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:

    • Nome dell'articolo per Name.The name of the article for Name.

    • Nome della pubblicazione per PublicationName.The name of the publication for PublicationName.

    • (Facoltativo) Se l'articolo è filtrato orizzontalmente, specificare la clausola del filtro di riga per la proprietà FilterClause.(Optional) If the article is horizontally filtered, specify the row filter clause for the FilterClause property. Utilizzare questa proprietà per specificare un filtro di riga statico o con parametri.Use this property to specify a static or parameterized row filter. Per altre informazioni, vedere Parameterized Row Filters.For more information, see Parameterized Row Filters.

      Per altre informazioni, vedere Define an Article.For more information, see Define an Article.

  6. Chiamare il metodo Create.Call the Create method.

  7. Ripetere i passaggi 5 e 6 per ogni articolo che includerà il record logico.Repeat steps 5 and 6 for each article comprising the logical record.

  8. Creare un'istanza della classe MergeJoinFilter per definire la relazione tra record logici tra gli articoli.Create an instance of the MergeJoinFilter class to define the logical record relationship between articles. Impostare quindi le proprietà seguenti:Then, set the following properties:

  9. Chiamare il metodo AddMergeJoinFilter sull'oggetto che rappresenta l'articolo figlio nella relazione.Call the AddMergeJoinFilter method on the object that represents the child article in the relationship. Passare l'oggetto MergeJoinFilter dal passaggio 8 per definire la relazione.Pass the MergeJoinFilter object from step 8 to define the relationship.

  10. Ripetere i passaggi 8 e 9 per tutte le altre relazioni tra record logici incluse nella pubblicazione.Repeat steps 8 and 9 for each remaining logical record relationship in the publication.

Esempio (RMO) Example (RMO)

In questo esempio viene creato un record logico che comprende i due nuovi articoli per le tabelle SalesOrderHeader e 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

Vedere ancheSee Also

Define and Modify a Join Filter Between Merge Articles Define and Modify a Join Filter Between Merge Articles
Definire e modificare un filtro di riga con parametri per un articolo di merge Define and Modify a Parameterized Row Filter for a Merge Article
Definire e modificare un filtro di riga statico Define and Modify a Static Row Filter
Raggruppare modifiche alle righe correlate con record logici Group Changes to Related Rows with Logical Records
Ottimizzare le prestazioni dei filtri con parametri con le partizioni pre-calcolate Optimize Parameterized Filter Performance with Precomputed Partitions
Raggruppare modifiche alle righe correlate con record logici Group Changes to Related Rows with Logical Records