병합 아티클 사이에서 조인 필터 정의 및 수정Define and Modify a Join Filter Between Merge Articles

SQL Server 2017SQL Server 2017 또는 SQL Server Management StudioSQL Server Management Studio 을 사용하여 Transact-SQLTransact-SQL에서 병합 아티클 간의 조인 필터를 정의하고 수정하는 방법에 대해 설명합니다.This topic describes how to define and modify a join filter between merge articles in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. 병합 복제는 조인 필터를 지원합니다. 조인 필터는 일반적으로 테이블 파티션을 다른 관련 테이블 아티클로 확장하기 위해 매개 변수가 있는 필터와 함께 사용됩니다.Merge replication supports join filters, which are typically used in conjunction with parameterized filters to extend table partitioning to other related table articles.

항목 내용In This Topic

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

제한 사항 Limitations and Restrictions

  • 조인 필터를 만들려면 게시에 최소한 두 개 이상의 관련 테이블이 포함되어야 합니다.To create a join filter, a publication must contain at least two related tables. 조인 필터는 행 필터를 확장하므로 다른 테이블과의 조인으로 필터를 확장하려면 한 테이블의 행 필터를 정의해야 합니다.A join filter extends a row filter; therefore you must define a row filter on one table before you can extend the filter with a join to another table. 게시에 추가 관련 테이블이 포함되는 경우 한 조인 필터를 정의한 후에 다른 조인 필터를 사용하여 이 조인 필터를 확장할 수 있습니다.After one join filter is defined, you can extend this join filter with another join filter if the publication contains additional related tables.

  • 게시에 대한 구독이 초기화된 후 조인 필터를 추가, 수정 또는 삭제한 경우에는 변경 내용을 적용한 후에 새 스냅숏을 생성하고 모든 구독을 다시 초기화해야 합니다.If you add, modify, or delete a join filter 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.

권장 사항 Recommendations

SQL Server Management Studio 사용 Using SQL Server Management Studio

새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - <게시> 대화 상자의 행 필터 페이지에서 조인 필터를 정의, 수정 및 삭제합니다.Define, modify, and delete join filters on the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of 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.

조인 필터를 정의하려면To define a join filter

  1. 새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - <게시>행 필터 페이지에 있는 필터링된 테이블 창에서 기존 행 필터 또는 조인 필터를 선택합니다.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select an existing row filter or join filter in the Filtered Tables pane.

  2. 추가를 클릭한 다음 선택한 필터 확장을 위해 조인 추가를 클릭합니다.Click Add, and then click Add Join to Extend the Selected Filter.

  3. 조인 문을 작성합니다. 새 조인을 추가하는 경우 작성기를 사용하여 문 작성 또는 조인 문 직접 작성을 선택합니다.Create the join statement: select either Use the builder to create the statement or Write the join the statement manually.

    • 작성기 사용을 선택하면 표의 열(결합, 필터링된 테이블 열, 연산자조인된 테이블 열)을 사용하여 조인 문을 작성합니다.If you select to use the builder, use the columns in the grid (Conjunction, Filtered table column, Operator, and Joined table column) to build a join statement.

      표의 각 열에는 드롭다운 콤보 상자가 들어 있습니다. 여기서 두 개의 열과 연산자 1개(=, <>, <=, <, >=, >like)를 선택할 수 있습니다.Each column in the grid contains a drop-down combo box, allowing you to select two columns and an operator (=, <>, <=, <, >=, >, and like). 결과는 미리 보기 텍스트 영역에 표시됩니다.The results are displayed in the Preview text area. 조인이 둘 이상의 열 쌍을 포함하면 결합 열에서 결합(AND 또는 OR)을 선택한 다음 두 개 이상의 열과 연산자를 입력합니다.If the join involves more than one pair of columns, select a conjunction (AND or OR) from the Conjunction column, and then enter two more columns and an operator.

    • 수동으로 문 작성을 선택하면 조인 문 텍스트 영역에 조인 문을 작성합니다.If you select to write the statement manually, write the join statement in the Join statement text area. 필터링된 테이블 열 목록 상자 및 조인된 테이블 열 목록 상자를 사용하여 열을 조인 문 텍스트 영역에 끌어다 놓습니다.Use the Filtered table columns list box and the Joined table columns list box to drag and drop columns to the Join statement text area.

    • 완전한 조인 문은 다음과 같습니다.The complete join statement would appear like:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] INNER JOIN [Sales].[SalesOrderDetail] ON [SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]  
      

      JOIN 절은 두 부분으로 구성된 이름을 사용해야 하며 세 부분 또는 네 부분으로 구성된 이름은 사용할 수 없습니다.The JOIN clause should use two-part naming; three-part naming and four-part naming are not supported.

  4. 조인 옵션을 지정합니다.Specify join options:

    • 필터링된 테이블(부모 테이블)에서 조인하는 열이 고유하면 고유 키를 선택합니다.If the column on which you join in the filtered table (the parent table) is unique, select Unique key.

      주의

      이 옵션을 선택하면 조인 필터에서의 자식 테이블과 부모 테이블 간의 관계가 일대일 또는 일대다가 됩니다.Selecting this option indicates that the relationship between the child and parent tables in a join filter is one to one or one to many. 자식 테이블에 있는 조인 열이 고유해야 하는 경우에만 이 옵션을 선택합니다.Only select this option if you have a constraint on the joining column in the child table that guarantees uniqueness. 이 옵션이 잘못 설정되면 데이터가 일치하지 않을 수 있습니다.If the option is set incorrectly, non-convergence of data can occur.

    • 기본적으로 병합 복제는 동기화 과정에서 행별로 변경 내용을 처리합니다.By default, merge replication processes changes on a row-by-row basis during synchronization. 필터링된 테이블과 조인된 테이블 행의 관련 변경 내용을 하나의 단위로 처리하려면 논리적 레코드 ( MicrosoftMicrosoft SQL Server 2005SQL Server 2005 이후 버전에서만 제공).To have related changes in rows of both the filtered table and the joined table processed as a unit, select Logical record ( MicrosoftMicrosoft SQL Server 2005SQL Server 2005 and later versions only). 논리적 레코드를 사용하기 위한 아티클 및 게시 요구 사항이 충족되는 경우에만 이 옵션을 사용할 수 있습니다.This option is available only if the article and publication requirements for using logical records are met. 자세한 내용은 논리적 레코드를 사용하여 관련된 행의 변경 내용 그룹화에서 "논리적 레코드 사용 시 고려 사항" 섹션을 참조하세요.For more information see the section "Considerations for Using Logical Records" in Group Changes to Related Rows with Logical Records.

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

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

조인 필터를 수정하려면To modify a join filter

  1. 새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - <게시> 대화 상자의 행 필터 페이지에 있는 필터링된 테이블 창에서 필터를 선택하고 편집을 클릭합니다.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select a filter in the Filtered Tables pane, and then click Edit.

  2. 조인 편집 대화 상자에서 필터를 수정합니다.In the Edit Join dialog box, modify the filter.

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

조인 필터를 삭제하려면To delete a join filter

  1. 새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - <게시> 대화 상자의 행 필터 페이지에 있는 필터링된 테이블 창에서 필터를 선택하고 삭제를 클릭합니다.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, 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

다음 절차에서는 부모 아티클의 매개 변수가 있는 필터 및 이 아티클과 관련 자식 아티클 간의 조인 필터를 보여 줍니다.These procedures show a parameterized filter on a parent article with join filters between this article and related child articles. 조인 필터는 복제 저장 프로시저를 사용하여 프로그래밍 방식으로 정의 및 수정할 수 있습니다.Join filters can be defined and modified programmatically using replication stored procedures.

아티클 필터를 병합 복제의 관련 아티클로 확장하도록 조인 필터를 정의하려면To define a join filter to extend an article filter to related articles in a merge publication

  1. 조인되는 아티클, 즉 부모 아티클에 대한 필터링을 정의합니다.Define the filtering for the article being joined to, which is also known as the parent article.

  2. 게시 데이터베이스의 게시자에서 sp_addmergearticle(Transact-SQL)을 실행하여 게시에 대한 하나 이상의 관련 아티클, 즉 자식 아티클을 정의합니다.At the Publisher on the publication database, execute sp_addmergearticle (Transact-SQL) to define one or more related articles, which are also known as child articles, for the publication. 자세한 내용은 Define an Article을 참조하세요.For more information, see Define an Article.

  3. 게시 데이터베이스의 게시자에서 sp_addmergefilter(Transact-SQL)를 실행합니다.At the Publisher on the publication database, execute sp_addmergefilter (Transact-SQL). @publication을 지정하고 @filtername에 이 필터에 대한 고유한 이름을, @article에 2단계에서 만든 자식 아티클의 이름을, @join_articlename에 조인되는 부모 아티클의 이름을, @join_unique_key에 다음 값 중 하나를 지정합니다.Specify @publication, a unique name for this filter for @filtername, the name of the child article created in step 2 for @article, the name of the parent article being joined to for @join_articlename, and one of the following values for @join_unique_key:

    • 0 - 부모 아티클과 자식 아티클 간의 다 대 일 또는 다 대 다 조인을 나타냅니다.0 - indicates a many-to-one or many-to-many join between the parent and child articles.

    • 1 - 부모 아티클과 자식 아티클 간의 일 대 일 또는 일 대 다 조인을 나타냅니다.1 - indicates a one-to-one or one-to-many join between the parent and child articles.

      이는 두 아티클 간의 조인 필터를 정의합니다.This defines a join filter between the two articles.

    주의

    부모 아티클의 기반 테이블에 있는 조인 열에 고유성을 보장하는 제약 조건이 있는 경우에만 @join_unique_key1 로 설정하세요.Only set @join_unique_key to 1 if you have a constraint on the joining column in the underlying table for the parent article that guarantees uniqueness. @join_unique_key1로 설정하면 데이터가 일치하지 않을 수 있습니다.If @join_unique_key is set to 1 incorrectly, non-convergence of data may occur.

예(Transact-SQL) Examples (Transact-SQL)

다음 예에서는 정적 행 필터를 사용하여 자체 필터링되는 SalesOrderDetail 테이블에 대해 SalesOrderHeader 테이블 아티클을 필터링하는 병합 게시에 대한 아티클을 정의합니다.This example defines an article for a merge publication, where the SalesOrderDetail table article is filtered against the SalesOrderHeader table that is itself filtered using a static row filter. 자세한 내용은 Define and Modify a Static Row Filter을 참조하세요.For more information, see Define and Modify a Static Row Filter.

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);
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @table1 = N'Employee'; 
SET @table2 = N'SalesOrderHeader'; 
SET @table3 = N'SalesOrderDetail'; 
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';

-- 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 that is filtered
-- based on Employee and horizontally filtered.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_object = @table2, 
  @type = N'table', 
  @source_owner = @salesschema, 
  @vertical_partition = N'true',
  @schema_option = 0x0034EF1,
  @description = N'article for the SalesOrderDetail table';

-- Add an article for the SalesOrderDetail table that is filtered
-- based on SaledOrderHeader.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table3, 
  @source_object = @table3, 
  @source_owner = @salesschema,
  @description = 'article for the SalesOrderHeader table', 
  @identityrangemanagementoption = N'auto', 
  @pub_identity_range = 100000, 
  @identity_range = 100, 
  @threshold = 80,
  @schema_option = 0x0004EF1;

-- Add all columns to the SalesOrderHeader article.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Remove the credit card Approval Code column.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @column = N'CreditCardApprovalCode', 
  @operation = N'drop', 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- 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.BusinessEntityID = SalesOrderHeader.SalesPersonID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table3, 
  @filtername = N'SalesOrderDetail_SalesOrderHeader', 
  @join_articlename = @table2, 
  @join_filterclause = N'SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;
GO

다음 예에서는 병합 게시의 아티클 그룹을 정의합니다. 이 병합 게시에서는 Employee LoginID 열의 HOST_NAME 값을 대상으로 매개 변수가 있는 행 필터를 사용하여 자체 필터링되는 테이블에 대해 일련의 조인 필터로 아티클이 필터링됩니다.This example defines a group of articles in a merge publication where the articles are filtered with a series of join filters against the Employee table that is itself filtered using a parameterized row filter on the value of HOST_NAME in the LoginID column. 자세한 내용은 Define and Modify a Parameterized Row Filter for a Merge Article을 참조하세요.For more information, see Define and Modify a Parameterized Row Filter for a Merge Article.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2012';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2012];

-- Enable AdventureWorks2012 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule. 
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2012.', 
  @allow_subscriber_initiated_snapshot = N'true',
  @publication_compatibility_level = N'90RTM';

-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(login), 
  @job_password = $(password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains salesperson information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time 
-- the subscription is synchronized. 
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

관련 항목:See Also

조인 필터 Join Filters
매개 변수가 있는 행 필터 Parameterized Row Filters
게시 및 아티클 속성 변경 Change Publication and Article Properties
병합 복제의 게시된 데이터 필터링 Filter Published Data for Merge Replication
방법: 병합 아티클 간의 조인 필터 정의 및 수정(SQL Server Management Studio) How to: Define and Modify a Join Filter Between Merge Articles (SQL Server Management Studio)
복제 시스템 저장 프로시저 개념 Replication System Stored Procedures Concepts
병합 테이블 아티클 간의 논리적 레코드 관계 정의 Define a Logical Record Relationship Between Merge Table Articles
병합 아티클에 대한 매개 변수가 있는 행 필터 정의 및 수정 Define and Modify a Parameterized Row Filter for a Merge Article