병합 아티클 사이에서 조인 필터 정의 및 수정

적용 대상:SQL Server

이 항목에서는 SQL Server Management Studio 또는 Transact-SQL을 사용하여 SQL Server의 병합 아티클 간에 조인 필터를 정의하고 수정하는 방법에 대해 설명합니다. Merge 복제본(replica)tion은 일반적으로 매개 변수가 있는 필터와 함께 사용되는 조인 필터를 지원하여 테이블 분할을 다른 관련 테이블 아티클로 확장합니다.

항목 내용

시작하기 전에

제한 사항

  • 조인 필터를 만들려면 게시에 관련 테이블이 두 개 이상 포함되어야 합니다. 조인 필터는 행 필터를 확장합니다. 따라서 조인을 사용하여 필터를 다른 테이블로 확장하려면 먼저 한 테이블에 행 필터를 정의해야 합니다. 하나의 조인 필터가 정의되면 게시에 추가 관련 테이블이 포함된 경우 이 조인 필터를 다른 조인 필터로 확장할 수 있습니다.

  • 게시에 대한 구독이 초기화된 후 조인 필터를 추가, 수정 또는 삭제하는 경우 새 스냅샷 생성하고 변경 후 모든 구독을 다시 초기화해야 합니다. 속성 변경 요구 사항에 대한 자세한 내용은 게시 및 아티클 속성 변경을 참조 하세요.

권장 사항

SQL Server Management Studio 사용

새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - 게시> 대화 상자의 행 필터 페이지에서 조인 <필터정의, 수정 및 삭제합니다. 마법사 사용 및 대화 상자 액세스에 대한 자세한 내용은 게시 만들기게시 속성 보기 및 수정을 참조하세요.

조인 필터를 정의하려면

  1. 새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - <게시>의 필터 페이지에서 필터링된 테이블 창에서 기존 행 필터 또는 조인 필터를 선택합니다.

  2. 추가를 클릭한 다음 선택한 필터 확장을 위해 조인 추가를 클릭합니다.

  3. join 문을 만듭니다. 작성기를 사용하여 문을 만들거나 수동으로 조인을 작성합니다.

    • 작성기를 사용하도록 선택하는 경우 그리드의 열(연결, 필터링된 테이블 열, 연산자조인된 테이블 열)을 사용하여 조인 문을 작성합니다.

      표의 각 열에는 드롭다운 콤보 상자가 포함되어 있어 두 개의 열과 연산자(=, <><=, ,> =,><)를 선택할 수 있습니다. 결과는 미리 보기 텍스트 영역에 표시됩니다. 조인에 둘 이상의 열 쌍이 포함된 경우 연결 열에서 연결(AND 또는 OR)을 선택한 다음 두 개의 열과 연산자를 더 입력합니다.

    • 문을 수동으로 작성하도록 선택한 경우 Join 문 텍스트 영역에 조인 문을 작성합니다. 필터링된 테이블 열 목록 상자와 조인된 테이블 열 목록 상자를 사용하여 열을 Join 문 텍스트 영역으로 끌어서 놓습니다.

    • 전체 조인 문은 다음과 같이 표시됩니다.

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

      JOIN 절은 두 부분으로 구성된 명명을 사용해야 합니다. 3부로 구성된 명명 및 4부로 구성된 명명은 지원되지 않습니다.

  4. 조인 옵션을 지정합니다.

    • 필터링된 테이블(부모 테이블)에 조인하는 열이 고유하면 고유 키를 선택합니다.

      주의

      이 옵션을 선택하면 조인 필터에서 자식 테이블과 부모 테이블 간의 관계가 일대일 또는 일 대 다임을 나타냅니다. 자식 테이블에 있는 조인 열이 고유해야 하는 경우에만 이 옵션을 선택합니다. 옵션이 잘못 설정된 경우 데이터의 비수렴이 발생할 수 있습니다.

    • 기본적으로 병합 복제본(replica) 동기화 중에 행 단위로 변경 내용을 처리합니다. 필터링된 테이블과 조인된 테이블의 행을 하나의 단위로 처리하여 관련 변경 내용을 적용하려면 논리 레코드(Microsoft SQL Server 2005(9.x) 이상 버전만 해당)를 선택합니다. 이 옵션은 논리 레코드 사용에 대한 아티클 및 게시 요구 사항이 충족되는 경우에만 사용할 수 있습니다. 자세한 내용은 논리적 레코드를 사용하여 관련된 행의 변경 내용 그룹화에서 "논리적 레코드 사용 시 고려 사항" 섹션을 참조하세요.

  5. 확인을 선택합니다.

  6. 게시 속성 - <게시> 대화 상자에 있는 경우 [확인]을 클릭하여 대화 상자를 저장하고 닫습니다.

조인 필터를 수정하려면

  1. 새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - <게시> 필터 페이지에서 필터링된 테이블 창에서 필터를 선택한 다음 편집을 클릭합니다.

  2. 조인 편집 대화 상자에서 필터를 수정합니다.

  3. 확인을 선택합니다.

조인 필터를 삭제하려면

  1. 새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - <게시> 필터 페이지에서 필터링된 테이블 창에서 필터를 선택한 다음 삭제를 클릭합니다. 삭제한 조인 필터 자체가 다른 조인에 의해 확장된 경우 해당 조인도 삭제됩니다.

Transact-SQL 사용

다음 절차에서는 부모 아티클의 매개 변수가 있는 필터 및 이 아티클과 관련 자식 아티클 간의 조인 필터를 보여 줍니다. 조인 필터는 복제본(replica)tion 저장 프로시저를 사용하여 프로그래밍 방식으로 정의하고 수정할 수 있습니다.

병합 게시의 관련 아티클로 아티클 필터를 확장하도록 조인 필터를 정의하려면

  1. 조인되는 아티클, 즉 부모 아티클에 대한 필터링을 정의합니다.

    • 매개 변수가 있는 행 필터를 사용하여 필터링된 아티클은 병합 아티클에 대한 매개 변수가 있는 행 필터 정의 및 수정을 참조 하세요.

    • 정적 행 필터를 사용하여 필터링되는 아티클의 경우 Define and Modify a Static Row Filter을 참조하세요.

  2. 게시 데이터베이스의 게시자에서 sp_addmergearticle(Transact-SQL)를 실행하여 게시에 대해 자식 아티클이라고도 하는 하나 이상의 관련 아티클을 정의합니다. 자세한 내용은 아티클 정의를 참조 하세요.

  3. 게시 데이터베이스의 게시자에서 sp_addmergefilter(Transact-SQL)를 실행합니다. 이 필터@filtername의 고유한 이름, 2@article단계에서 만든 자식 아티클 이름, 조인할 @join_articlename부모 아티클의 이름 및 다음 값 @join_unique_key중 하나를 지정@publication합니다.

    • 0 - 부모 아티클과 자식 아티클 간의 다대일 또는 다대다 조인을 나타냅니다.

    • 1 - 부모 아티클과 자식 아티클 간의 일 대 일 또는 일 대 다 조인을 나타냅니다.

    이는 두 아티클 간의 조인 필터를 정의합니다.

    주의

    고유성을 보장하는 부모 아티클에 대한 기본 테이블의 조인 열에 제약 조건이 있는 경우에만 1로 설정합니다.@join_unique_key 1잘못 설정된 경우 @join_unique_key 데이터의 비수렴이 발생할 수 있습니다.

예제(Transact-SQL)

다음 예에서는 정적 행 필터를 사용하여 자체 필터링되는 SalesOrderDetail 테이블에 대해 SalesOrderHeader 테이블 아티클을 필터링하는 병합 게시에 대한 아티클을 정의합니다. 자세한 내용은 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

다음은 LoginID 열의 HOST_NAME값에 대해 매개 변수가 있는 행 필터를 사용하여 필터링된 테이블에 대해 Employee 일련의 조인 필터를 사용하여 아티클을 필터링하는 병합 게시의 아티클 그룹을 정의하는 예제입니다. 자세한 내용은 병합 아티클에 대한 매개 변수가 있는 행 필터 정의 및 수정을 참조하세요.

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

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

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

USE [AdventureWorks2022];

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

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

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

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

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

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

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

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

참고 항목

조인 필터
매개 변수가 있는 행 필터
게시 및 아티클 속성 변경
병합 복제의 게시된 데이터 필터링
방법: 병합 아티클 간의 조인 필터 정의 및 수정(SQL Server Management Studio)
Replication System Stored Procedures Concepts
병합 테이블 아티클 간의 논리적 레코드 관계 정의
병합 아티클에 대한 매개 변수가 있는 행 필터 정의 및 수정