병합 아티클에 대한 매개 변수가 있는 행 필터 정의 및 수정Define and Modify a Parameterized Row Filter for a Merge Article

SQL Server 2017SQL Server 2017 또는 SQL Server Management StudioSQL Server Management Studio 을 사용하여 Transact-SQLTransact-SQL에서 매개 변수가 있는 행 필터를 정의하고 수정하는 방법에 대해 설명합니다.This topic describes how to define and modify a parameterized row filter in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL.

테이블 아티클을 만들 때 매개 변수가 있는 행 필터를 사용할 수 있습니다.When creating table articles, you can use parameterized row filters. 이러한 필터에서는 게시할 해당 데이터를 선택하기 위해 WHERE 절을 사용합니다.These filters use a WHERE clause to select the appropriate data to be published. 정적 행 필터와는 달리 해당 절에 리터럴 값을 지정하는 대신 SUSER_SNAMEHOST_NAME시스템 함수를 하나 또는 둘 모두 지정합니다.Rather than specifying a literal value in the clause (as you do with a static row filter), you specify one or both of the following system functions: SUSER_SNAME and HOST_NAME. 자세한 내용은 매개 변수가 있는 행 필터를 참조하십시오.For more information, see Parameterized Row Filters.

항목 내용In This Topic

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

제한 사항 Limitations and Restrictions

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

  • 성능상의 이유로 LEFT([MyColumn]) = SUSER_SNAME()과 같은 매개 변수가 있는 행 필터 절의 열 이름에는 함수를 적용하지 않는 것이 좋습니다.For performance reasons, we recommend that you not apply functions to column names in parameterized row filter clauses, such as LEFT([MyColumn]) = SUSER_SNAME(). 필터 절에 HOST_NAME을 사용하고 HOST_NAME 값을 재지정할 경우 CONVERT를 사용하여 데이터 형식을 변환해야 할 수 있습니다.If you use HOST_NAME in a filter clause and override the HOST_NAME value, it might be necessary to convert data types using CONVERT. 이를 위한 최선의 구현 방법은 Parameterized Row Filters항목의 "HOST_NAME() 값 재정의" 섹션을 참조하십시오.For more information about best practices for this case, see the section "Overriding the HOST_NAME() Value" in the topic Parameterized Row Filters.

SQL Server Management Studio 사용 Using SQL Server Management Studio

새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - <게시> 대화 상자의 행 필터 페이지에서 매개 변수가 있는 행 필터를 정의, 수정 및 삭제합니다.Define, modify, and delete parameterized row 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 parameterized row filter

  1. 새 게시 마법사의 테이블 행 필터 페이지 또는 게시 속성 - <게시>행 필터 페이지에서 추가를 클릭하고 필터 추가를 클릭합니다.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, click Add, and then click Add Filter.

  2. 필터 추가 대화 상자의 드롭다운 목록 상자에서 필터링할 테이블을 선택합니다.In the Add Filter dialog box, select a table to filter from the drop-down list box.

  3. 필터 문 입력란에서 필터 문을 만듭니다.Create a filter statement in the Filter statement text box. 텍스트 영역에 직접 입력할 수도 있고 목록 상자에서 열을 끌어서 놓을 수도 있습니다.You can type directly in the text area, and you can also drag and drop columns from the Columns list box.

    • 필터 문 텍스트 영역에는 다음 형식의 기본 텍스트가 포함됩니다.The Filter statement text area includes the default text, which is in the form of:

      SELECT <published_columns> FROM [tableowner].[tablename] WHERE  
      
    • 기본 텍스트는 변경할 수 없습니다. 표준 SQL 구문을 사용하여 WHERE 키워드 뒤에 필터 절을 입력합니다.The default text cannot be changed; type the filter clause after the WHERE keyword using standard SQL syntax. 매개 변수가 있는 필터는 HOST_NAME() 및/또는 SUSER_SNAME()시스템 함수 또는 이러한 함수 중 하나 또는 둘 다를 참조하는 사용자 정의 함수에 대한 호출을 포함합니다.A parameterized filter includes a call to the system function HOST_NAME() and/or SUSER_SNAME(), or a user-defined function that references one or both of these functions. 다음 예에서는 매개 변수가 있는 행 필터에 대한 전체 필터 절입니다.The following is an example of a complete filter clause for a parameterized row filter:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE LoginID = SUSER_SNAME()  
      

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

  4. 구독자 간에 데이터를 공유하는 방식과 일치하는 옵션을 선택합니다.Select the option that matches how data will be shared among Subscribers:

    • 이 테이블의 행을 여러 구독으로 이동A row from this table will go to multiple subscriptions

    • 이 테이블의 행을 단일 구독으로 이동A row from this table will go to only one subscription

      이 테이블의 행을 단일 구독으로 이동을 선택하면 병합 복제에서는 보다 작은 메타데이터를 저장하고 처리하여 성능을 최적화할 수 있습니다.If you select A row from this table will go to only one subscription, merge replication can optimize performance by storing and processing less metadata. 그러나 한 행이 둘 이상의 구독자로 복제될 수 없도록 데이터가 분할되어야 합니다.However, you must ensure that the data is partitioned in such a way that a row cannot be replicated to more than one Subscriber. 자세한 내용은 Parameterized Row Filters항목의 "'partition options' 설정" 섹션을 참조하십시오.For more information, see the section "Setting 'partition options'" in the topic Parameterized Row Filters.

  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 parameterized row 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 Filter dialog box, modify the filter.

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

매개 변수가 있는 행 필터를 삭제하려면To delete a parameterized row 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.

Transact-SQL 사용 Using Transact-SQL

복제 저장 프로시저를 사용하여 매개 변수가 있는 행 필터를 프로그래밍 방식으로 만들거나 수정할 수 있습니다.Parameterized row filters can be created and modified programmatically using replication stored procedures.

병합 게시에서 아티클에 대한 매개 변수가 있는 행 필터를 정의하려면To define a parameterized row filter for an article in a merge publication

  1. 게시 데이터베이스의 게시자에서 sp_addmergearticle(Transact-SQL)을 실행합니다.At the Publisher on the publication database, execute sp_addmergearticle (Transact-SQL). @publication을 지정하고 @article에 아티클 이름을, @source_object에 게시되는 테이블을, @subset_filterclause에 매개 변수가 있는 필터를 정의하는 WHERE 절(WHERE 제외)을, @partition_options에 매개 변수가 있는 행 필터의 결과에 따른 분할 유형을 정의하는 다음 값 중 하나를 지정합니다.Specify @publication, a name for the article for @article, the table being published for @source_object, the WHERE clause that defines the parameterized filter for @subset_filterclause (not including WHERE), and one of the following values for @partition_options, which describes the type of partitioning that will result from the parameterized row filter:

    • 0 - 아티클의 필터링이 정적이거나 각 파티션에 대한 데이터의 고유 하위 집합을 생성합니다. 즉 "겹치는" 파티션을 생성하지 않습니다.0 - Filtering for the article either is static or does not yield a unique subset of data for each partition (an "overlapping" partition).

    • 1 - 결과 파티션이 겹치며 구독자에 변경된 내용이 있어도 행이 속한 파티션이 변경되지 않습니다.1 - Resulting partitions are overlapping, and updates made at the Subscriber cannot change the partition to which a row belongs.

    • 2 - 아티클을 필터링하면 겹치지 않는 파티션이 생성되지만 여러 구독자가 동일한 파티션을 받을 수 있습니다.2 - Filtering for the article yields nonoverlapping partitions, but multiple Subscribers can receive the same partition.

    • 3 - 아티클을 필터링하면 각 구독에 고유한 겹치지 않는 파티션이 생성됩니다.3 - Filtering for the article yields nonoverlapping partitions that are unique for each subscription.

병합 게시에서 아티클에 대한 매개 변수가 있는 행 필터를 변경하려면To change a parameterized row filter for an article in a merge publication

  1. 게시 데이터베이스의 게시자에서 sp_changemergearticle을 실행합니다.At the Publisher on the publication database, execute sp_changemergearticle. @publication@article을 지정하고 @propertysubset_filterclause 값을, @value에 매개 변수가 있는 필터를 정의하는 식(WHERE 제외)을, @force_invalidate_snapshot@force_reinit_subscription 둘 다에 1 값을 지정합니다.Specify @publication, @article, a value of subset_filterclause for @property, the expression that defines the parameterized filter for @value (not including WHERE), and a value of 1 for both @force_invalidate_snapshot and @force_reinit_subscription.

  2. 이 변경 내용으로 인해 파티션에 변화가 생기면 sp_changemergearticle 을 다시 실행합니다.If this change results in different partitioning behavior, then execute sp_changemergearticle again. @publication@article을 지정하고 @propertypartition_options 값을, @value에 가장 적합한 분할 옵션을 다음 중 하나로 지정합니다.Specify @publication, @article, a value of partition_options for @property, and the most appropriate partitioning option for @value, which can be one of the following:

    • 0 - 아티클의 필터링이 정적이거나 각 파티션에 대한 데이터의 고유 하위 집합을 생성합니다. 즉 "겹치는" 파티션을 생성하지 않습니다.0 - Filtering for the article either is static or does not yield a unique subset of data for each partition (an "overlapping" partition).

    • 1 - 결과 파티션이 겹치며 구독자에 변경된 내용이 있어도 행이 속한 파티션이 변경되지 않습니다.1 - Resulting partitions are overlapping, and updates made at the Subscriber cannot change the partition to which a row belongs.

    • 2 - 아티클을 필터링하면 겹치지 않는 파티션이 생성되지만 여러 구독자가 동일한 파티션을 받을 수 있습니다.2 - Filtering for the article yields nonoverlapping partitions, but multiple Subscribers can receive the same partition.

    • 3 - 아티클을 필터링하면 각 구독에 고유한 겹치지 않는 파티션이 생성됩니다.3 - Filtering for the article yields nonoverlapping partitions that are unique for each subscription.

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

다음 예에서는 병합 게시의 아티클 그룹을 정의합니다. 이 병합 게시에서는 Employee LoginID 열을 기준으로 매개 변수가 있는 행 필터를 사용하여 자체 필터링되는 테이블에 대해 일련의 조인 필터로 아티클이 필터링됩니다.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 LoginID column. 동기화 중에 HOST_NAME 함수에서 반환하는 값은 재정의됩니다.During synchronization, the value returned by the HOST_NAME function is overridden. 자세한 내용은 Parameterized Row Filters항목의 HOST_NAME() 값 재정의를 참조하십시오.For more information, see Overriding the HOST_NAME() Value in the topic Parameterized Row Filters.

-- 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

Define and Modify a Join Filter Between Merge Articles Define and Modify a Join Filter Between Merge Articles
게시 및 아티클 속성 변경 Change Publication and Article Properties
조인 필터 Join Filters
Parameterized Row Filters Parameterized Row Filters