병합 테이블 아티클 간의 논리적 레코드 관계 정의Define a Logical Record Relationship Between Merge Table Articles

이 항목에서는 SQL Server 2017SQL Server 2017 , SQL Server Management StudioSQL Server Management Studio또는 RMO(복제 관리 개체)를 사용하여 Transact-SQLTransact-SQL에서 테이블 아티클 간 논리적 레코드 관계를 정의하는 방법에 대해 설명합니다.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).

병합 복제를 사용하면 서로 다른 테이블에 있는 관련 행 간의 관계를 정의할 수 있습니다.Merge replication allows you to define a relationship between related rows in different tables. 그러면 동기화 중에 이러한 행을 하나의 트랜잭션 단위로 처리할 수 있습니다.These rows can then be processed as a transactional unit during synchronization. 논리적 레코드는 조인 필터 관계가 있는지 여부와 관계없이 두 아티클 간에 정의할 수 있습니다.A logical record can be defined between two articles whether or not they have a join filter relationship. 자세한 내용은 논리적 레코드를 사용하여 관련된 행의 변경 내용 그룹화를 참조하세요.For more information, see Group Changes to Related Rows with Logical Records.

참고

Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다.This feature will be removed in a future version of Microsoft SQL Server. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 응용 프로그램은 수정하세요.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

항목 내용In This Topic

시작하기 전 주의 사항 Before You Begin

제한 사항 Limitations and Restrictions

  • 게시에 대한 구독이 초기화된 후 논리적 레코드를 추가, 수정 또는 삭제한 경우에는 변경 내용을 적용한 후에 새 스냅숏을 생성하고 모든 구독을 다시 초기화해야 합니다.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. 속성 변경 요구 사항에 대한 자세한 내용은 게시 및 아티클 속성 변경을 참조하세요.For more information about requirements for property changes, see Change Publication and Article Properties.

SQL Server Management Studio 사용 Using SQL Server Management Studio

새 게시 마법사 및 게시 속성 - <게시> 대화 상자에서 사용할 수 있는 조인 추가 대화 상자에서 논리적 레코드를 정의합니다.Define logical records in the Add Join dialog box, which is available in the New Publication Wizard and the Publication Properties - <Publication> dialog box. 마법사 사용 및 대화 상자 액세스에 대한 자세한 내용은 게시 만들기게시 속성 보기 및 수정을 참조하세요.For more information about using the wizard and accessing the dialog box, see Create a Publication and View and Modify Publication Properties.

논리적 레코드가 병합 게시의 조인 필터에 적용되고 게시가 사전 계산 파티션을 사용하기 위한 요구 사항을 따르는 경우에만 조인 추가 대화 상자에서 논리적 레코드를 정의할 수 있습니다.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. 조인 필터에 적용되지 않는 논리적 레코드를 정의하고 논리적 레코드 수준에서 충돌 감지 및 해결을 설정하려면 저장 프로시저를 사용해야 합니다.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.

논리적 레코드 관계를 정의하려면To define a logical record relationship

  1. 새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - <게시> 대화 상자의 행 필터 페이지에 있는 필터링된 테이블 창에서 행 필터를 선택합니다.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 logical record relationship is associated with a join filter, which extends a row filter. 따라서 조인 필터로 확장하기 전에 행 필터를 정의한 다음 논리적 레코드 관계를 적용해야 합니다.Therefore you must define a row filter before you can extend the filter with a join and apply a logical record relationship. 한 조인 필터를 정의한 후에 다른 조인 필터를 사용하여 이 조인 필터를 확장할 수 있습니다.After one join filter is defined, you can extend this join filter with another join filter. 조인 필터 정의 방법은 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. 추가를 클릭한 다음 선택한 필터 확장을 위해 조인 추가를 클릭합니다.Click Add, and then click Add Join to Extend the Selected Filter.

  3. 조인 추가 대화 상자에서 조인 필터를 정의한 다음 논리적 레코드확인란을 선택합니다.Define a join filter in the Add Join dialog box, and then select the check box Logical Record.

  4. 게시 속성 - <게시> 대화 상자에 있는 경우 확인을 클릭하여 대화 상자를 저장하고 닫습니다.If you are in the Publication Properties - <Publication> dialog box, click OK to save and close the dialog box.

논리적 레코드 관계를 삭제하려면To delete a logical record relationship

  • 논리적 레코드 관계만 삭제하거나 논리적 레코드 관계 및 이와 관련된 조인 필터를 함께 삭제합니다.Delete only the logical record relationship or delete the logical record relationship and the join filter associated with it.

    논리적 레코드 관계만 삭제하려면To delete only the logical record relationship:

    1. 새 게시 마법사의 행 필터 페이지 또는 게시 속성 - <게시> 대화 상자의 행 필터 페이지에 있는 필터링된 테이블 창에서 논리적 레코드 관계와 연결된 조인 필터를 선택하고 편집을 클릭합니다.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. 조인 편집 대화 상자에서 논리적 레코드확인란 선택을 취소합니다.In the Edit Join dialog box, clear the check box Logical Record.

    3. 확인을 클릭합니다.Click OK.

      논리적 레코드 관계 및 이와 관련된 조인 필터를 함께 삭제하려면To delete the logical record relationship and join filter associated with it:

    • 새 게시 마법사의 행 필터 페이지 또는 게시 속성 - <게시> 대화 상자의 필터링된 테이블 창에서 필터를 선택하고 삭제를 클릭합니다.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. 삭제하는 조인 필터가 다른 조인에 의해 확장된 경우 해당 조인 또한 삭제됩니다.If the join filter you delete is itself extended by other joins, those joins will also be deleted.

Transact-SQL 사용 Using Transact-SQL

복제 저장 프로시저를 사용하여 아티클 간 논리적 레코드 관계를 프로그래밍 방식으로 지정할 수 있습니다.You can programmatically specify logical record relationships between articles using replication stored procedures.

관련된 조인 필터 없이 논리적 레코드 관계를 정의하려면To define a logical record relationship without an associated join filter

  1. 게시에 필터링된 아티클이 포함되어 있으면 sp_helpmergepublication을 실행하고 결과 집합에서 use_partition_groups 의 값을 확인합니다.If the publication contains any articles that are filtered, execute sp_helpmergepublication, and note the value of use_partition_groups in the result set.

    • 이 값이 1이면 사전 계산 파티션이 이미 사용되고 있는 것입니다.If the value is 1, then precomputed partitions are already being used.

    • 이 값이 0이면 게시 데이터베이스의 게시자에서 sp_changemergepublication 을 실행합니다.If the value is 0, then execute sp_changemergepublication at the Publisher on the publication database. @propertyuse_partition_groups 값을, @valuetrue 값을 지정합니다.Specify a value of use_partition_groups for @property and a value of true for @value.

      참고

      게시에서 사전 계산 파티션을 지원하지 않으면 논리적 레코드를 사용할 수 없습니다.If the publication does not support precomputed partitions, then logical records cannot be used. 자세한 내용은 사전 계산 파티션으로 매개 변수가 있는 필터 성능 최적화 항목에서 사전 계산 파티션을 사용하기 위한 요구 사항을 참조하세요.For more information, see Requirements for Using Precomputed Partitions in the topic Optimize Parameterized Filter Performance with Precomputed Partitions.

    • 이 값이 NULL이면 스냅숏 에이전트를 실행하여 게시에 대한 초기 스냅숏을 생성해야 합니다.If the value is NULL, then the Snapshot Agent needs to be run to generate the initial snapshot for the publication.

  2. 논리적 레코드를 구성하는 아티클이 없으면 게시 데이터베이스의 게시자에서 sp_addmergearticle 을 실행합니다.If the articles that will comprise the logical record do not exist, execute sp_addmergearticle at the Publisher on the publication database. 논리적 레코드에 대해 다음 충돌 감지 및 해결 옵션 중 하나를 지정합니다.Specify one of the following conflict detection and resolution options for the logical record:

    • 논리적 레코드의 관련 행 내에서 발생하는 충돌을 감지하여 해결하려면 @value@logical_record_level_conflict_detection@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.

    • 표준 행 수준 또는 열 수준의 충돌 감지 및 해결을 사용하려면 @logical_record_level_conflict_detection@logical_record_level_conflict_detection@logical_record_level_conflict_resolution값(기본값)을 지정합니다.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. 논리적 레코드를 구성하는 각 아티클에 대해 2단계를 반복합니다.Repeat step 2 for each article that will comprise the logical record. 논리적 레코드의 각 아티클에 대해 동일한 충돌 감지 및 해결 옵션을 사용해야 합니다.You must use the same conflict detection and resolution option for each article in the logical record. 자세한 내용은 Detecting and Resolving Conflicts in Logical Records을 참조하세요.For more information, see Detecting and Resolving Conflicts in Logical Records.

  4. 게시 데이터베이스의 게시자에서 sp_addmergefilter를 실행합니다.At the publisher on the publication database, execute sp_addmergefilter. @publication을 지정하고 @article에 관계 구성 아티클 중 하나의 이름을, @join_articlename에 두 번째 아티클의 이름을, @filtername에 관계의 이름을, @join_filterclause에 두 아티클 간 관계를 정의하는 절을, @join_unique_key에 조인 형식을, @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 - 논리적 관계를 정의합니다.2 - Defines a logical relationship.

    • 3 - 조인 필터를 포함하는 논리적 관계를 정의합니다.3 - Defines a logical relationship with a join filter.

    참고

    조인 필터를 사용하지 않는 경우 두 아티클 간의 관계 방향은 중요하지 않습니다.If a join filter is not used, the direction of the relationship between the two articles is not important.

  5. 게시에서 남은 각각의 논리적 레코드 관계에 대해 2단계를 반복합니다.Repeat step 2 for each remaining logical record relationship in the publication.

논리적 레코드에 대한 충돌 감지 및 해결을 변경하려면To change conflict detection and resolution for logical records

  1. 논리적 레코드의 관련 행 내에서 발생하는 충돌을 감지하고 해결하려면 다음을 수행합니다.To detect and resolve conflicts that occur within related rows in the logical record:

    • 게시 데이터베이스의 게시자에서 sp_changemergearticle을 실행합니다.At the Publisher on the publication database, execute sp_changemergearticle. @propertylogical_record_level_conflict_detection 값을, @valuetrue 값을 지정합니다.Specify a value of logical_record_level_conflict_detection for @property and a value of true for @value. @force_invalidate_snapshot@force_reinit_subscription1 값을 지정합니다.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

    • 게시 데이터베이스의 게시자에서 sp_changemergearticle을 실행합니다.At the Publisher on the publication database, execute sp_changemergearticle. @propertylogical_record_level_conflict_resolution 값을, @valuetrue 값을 지정합니다.Specify a value of logical_record_level_conflict_resolution for @property and a value of true for @value. @force_invalidate_snapshot@force_reinit_subscription1 값을 지정합니다.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

  2. 표준 행 수준 또는 열 수준의 충돌 감지 및 해결을 사용하려면 다음을 수행합니다.To use the standard row-level or column-level conflict detection and resolution:

    • 게시 데이터베이스의 게시자에서 sp_changemergearticle을 실행합니다.At the Publisher on the publication database, execute sp_changemergearticle. @propertylogical_record_level_conflict_detection 값을, @valuefalse 값을 지정합니다.Specify a value of logical_record_level_conflict_detection for @property and a value of false for @value. @force_invalidate_snapshot@force_reinit_subscription1 값을 지정합니다.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

    • 게시 데이터베이스의 게시자에서 sp_changemergearticle을 실행합니다.At the Publisher on the publication database, execute sp_changemergearticle. @propertylogical_record_level_conflict_resolution 값을, @valuefalse 값을 지정합니다.Specify a value of logical_record_level_conflict_resolution for @property and a value of false for @value. @force_invalidate_snapshot@force_reinit_subscription1 값을 지정합니다.Specify a value of 1 for @force_invalidate_snapshot and @force_reinit_subscription.

논리적 레코드 관계를 제거하려면To remove a logical record relationship

  1. 게시 데이터베이스의 게시자에서 다음 쿼리를 실행하여 지정된 게시에 대해 정의된 모든 논리적 레코드 관계 정보를 반환합니다.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;
    

    결과 집합의 filtername 열에서 제거되고 있는 논리적 레코드 관계의 이름을 확인합니다.Note the name of the logical record relationship being removed in the filtername column in the result set.

    참고

    이 쿼리는 sp_helpmergefilter와 동일한 정보를 반환하지만, 이 시스템 저장 프로시저는 조인 필터이기도 한 논리적 레코드 관계에 대한 정보만 반환합니다.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. 게시 데이터베이스의 게시자에서 sp_dropmergefilter를 실행합니다.At the Publisher on the publication database, execute sp_dropmergefilter. @publication을 지정하고 @article에 관계 구성 아티클 중 하나의 이름을, @filtername에 1단계의 관계 이름을 지정합니다.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.

예(Transact-SQL) Example (Transact-SQL)

이 예에서는 기존 게시에 사전 계산 파티션을 사용하고 SalesOrderHeaderSalesOrderDetail 테이블에 대한 두 개의 새 아티클을 구성하는 논리적 레코드를 만듭니다.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

RMO(복제 관리 개체) 사용 Using Replication Management Objects (RMO)

참고

병합 복제를 사용하면 충돌을 추적하고 논리적 레코드 수준에서 충돌을 해결하도록 지정할 수도 있지만 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.

관련된 조인 필터 없이 논리적 레코드 관계를 정의하려면To define a logical record relationship without an associated join filter

  1. ServerConnection 클래스를 사용하여 게시자 연결을 만듭니다.Create a connection to the Publisher by using the ServerConnection class.

  2. MergePublication 클래스의 인스턴스를 만들고 게시에 대한 NameDatabaseName 속성을 설정한 다음, 1단계에서 만든 연결에 ConnectionContext 속성을 설정합니다.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. LoadProperties 메서드를 호출하여 개체 속성을 가져옵니다.Call the LoadProperties method to get the properties of the object. 이 메서드가 false를 반환하는 경우 2단계에서 게시 속성이 올바르게 정의되지 않았거나 게시가 없습니다.If this method returns false, either the publication properties in step 2 were defined incorrectly or the publication does not exist.

  4. PartitionGroupsOption 속성이 False로 설정된 경우 True로 설정합니다.If the PartitionGroupsOption property is set to False, set it to True.

  5. 논리적 레코드를 구성하는 아티클이 없으면 MergeArticle 클래스의 인스턴스를 만들고 다음 속성을 설정합니다.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:

    • Name에 대한 아티클의 이름The name of the article for Name.

    • PublicationName에 대한 게시의 이름The name of the publication for PublicationName.

    • (옵션) 아티클이 행 필터링된 경우 FilterClause 속성에 대해 행 필터 절을 지정합니다.(Optional) If the article is horizontally filtered, specify the row filter clause for the FilterClause property. 이 속성을 사용하여 정적 또는 매개 변수가 있는 행 필터를 지정합니다.Use this property to specify a static or parameterized row filter. 자세한 내용은 Parameterized Row Filters을 참조하세요.For more information, see Parameterized Row Filters.

      자세한 내용은 Define an Article을 참조하세요.For more information, see Define an Article.

  6. Create 메서드를 호출합니다.Call the Create method.

  7. 논리적 레코드를 구성하는 각 아티클별로 5단계와 6단계를 반복합니다.Repeat steps 5 and 6 for each article comprising the logical record.

  8. MergeJoinFilter 클래스의 인스턴스를 만들어 아티클 간 논리적 레코드 관계를 정의합니다.Create an instance of the MergeJoinFilter class to define the logical record relationship between articles. 그런 후 다음 속성을 설정합니다.Then, set the following properties:

  9. 관계의 하위 아티클을 나타내는 개체에서 AddMergeJoinFilter 메서드를 호출합니다.Call the AddMergeJoinFilter method on the object that represents the child article in the relationship. 8단계에서 만든 MergeJoinFilter 개체를 전달하여 관계를 정의합니다.Pass the MergeJoinFilter object from step 8 to define the relationship.

  10. 게시의 나머지 논리적 레코드 관계별로 8단계와 9단계를 반복합니다.Repeat steps 8 and 9 for each remaining logical record relationship in the publication.

예(RMO) Example (RMO)

이 예제에서는 SalesOrderHeaderSalesOrderDetail 테이블의 새 아티클 두 개를 구성하는 논리적 레코드를 만듭니다.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

관련 항목:See Also

Define and Modify a Join Filter Between Merge Articles Define and Modify a Join Filter Between Merge Articles
병합 아티클에 대한 매개 변수가 있는 행 필터 정의 및 수정 Define and Modify a Parameterized Row Filter for a Merge Article
정적 행 필터 정의 및 수정 Define and Modify a Static Row Filter
논리적 레코드를 사용하여 관련된 행의 변경 내용 그룹화 Group Changes to Related Rows with Logical Records
사전 계산 파티션으로 매개 변수가 있는 필터 성능 최적화 Optimize Parameterized Filter Performance with Precomputed Partitions
논리적 레코드를 사용하여 관련된 행의 변경 내용 그룹화Group Changes to Related Rows with Logical Records