매개 변수가 있는 필터 - 매개 변수가 있는 행 필터

적용 대상:SQL Server

매개 변수가 있는 행 필터를 사용하면 여러 게시를 만들지 않고도 다양한 데이터 파티션을 다른 구독자로 보낼 수 있습니다(매개 변수가 있는 필터는 이전 버전의 SQL Server에서 동적 필터라고 함). 파티션은 테이블에 있는 행의 하위 집합입니다. 게시된 테이블의 각 행은 매개 변수가 있는 필터를 만들 때 선택한 설정에 따라 하나의 파티션에만 속하거나(겹치지 않는 파티션 생성) 두 개 이상의 파티션에 속할 수 있습니다(겹치는 파티션 생성).

오버오버되지 않는 파티션은 구독 간에 공유하거나 한 구독만 지정된 파티션을 받도록 제한할 수 있습니다. 파티션의 동작을 제어하는 설정은 나중에 이 항목의 "적절한 필터링 옵션 사용"에서 설명합니다. 이러한 설정을 사용하면 애플리케이션 및 성능 요구 사항에 따라 매개 변수가 있는 필터링을 조정할 수 있습니다. 일반적으로 겹치는 파티션은 유연성이 뛰어나고, 단일 구독으로 복제되는 겹치지 않는 파티션은 성능이 뛰어납니다.

매개 변수가 있는 필터는 단일 테이블에서 사용되며 일반적으로 조인 필터와 함께 사용하여 관련 테이블로 필터링을 확장합니다. 자세한 내용은 Join Filters를 참조하세요.

매개 변수가 있는 행 필터를 정의하거나 수정하려면 병합 아티클에 대한 매개 변수가 있는 행 필터 정의 및 수정을 참조 하세요.

매개 변수가 있는 필터의 작동 방식

매개 변수가 있는 행 필터는 WHERE 절을 사용하여 게시할 데이터를 선택합니다. 정적 행 필터와 마찬가지로 절에 리터럴 값을 지정하는 대신 SUSER_SNAME() 및 HOST_NAME()와 같은 시스템 함수 중 하나 또는 둘 다를 지정합니다. 사용자 정의 함수를 사용할 수도 있지만 사용자 정의 함수는 함수 본문에 SUSER_SNAME() 또는 HOST_NAME()을 포함해야 하거나 MyUDF(SUSER_SNAME()과 같은 시스템 함수 중 하나를 평가해야 합니다. 사용자 정의 함수가 함수 본문에 SUSER_SNAME() 또는 HOST_NAME()를 포함하는 경우 함수에 매개 변수를 전달할 수 없습니다.

시스템 함수 SUSER_SNAME() 및 HOST_NAME()는 병합 복제본(replica) 전용이 아니지만 매개 변수가 있는 필터링에 병합 복제본(replica) 사용됩니다.

  • SUSER_SNAME()는 SQL Server 인스턴스에 대한 연결에 대한 로그인 정보를 반환합니다. 매개 변수가 있는 필터에서 사용하면 병합 에이전트가 게시자로 연결할 때 사용한 로그인을 반환합니다. 로그인은 구독을 만들 때 지정합니다.

  • HOST_NAME()는 SQL Server 인스턴스에 연결하는 컴퓨터의 이름을 반환합니다. 매개 변수가 있는 필터에서 사용되는 경우 기본적으로 병합 에이전트 실행 중인 컴퓨터의 이름을 반환합니다. 끌어오기 구독의 경우 구독자의 이름입니다. 밀어넣기 구독의 경우 배포자의 이름입니다.

    구독자 또는 배포자의 이름이 아닌 값으로 이 함수를 재정의할 수도 있습니다. 일반적으로 애플리케이션에서는 판매 직원 이름 또는 판매 직원 ID와 같은 의미 있는 값으로 이 함수를 재정의합니다. 자세한 내용은 이 항목의 "HOST_NAME() 값 재정의" 섹션을 참조하세요.

시스템 함수에서 반환되는 값은 필터링할 테이블에 지정한 열과 비교되며 적절한 데이터가 구독자에 다운로드됩니다. 구독이 초기화되어 초기 스냅샷에 해당 데이터만 들어 있을 경우와 구독이 동기화될 때마다 이 비교를 수행합니다. 기본적으로 게시자의 변경으로 인해 파티션에서 행이 이동되면 구독자에서 행이 삭제됩니다(이 동작은 sp_addmergepublication 매개 변수(Transact-SQL)를 사용하여 @allow_partition_realignment 제어됨).

참고 항목

매개 변수가 있는 필터에 대해 비교가 수행될 경우 항상 데이터베이스 데이터 정렬을 사용합니다. 예를 들어 데이터베이스 데이터 정렬이 대/소문자를 구분하지 않지만 테이블 또는 열 데이터 정렬이 대/소문자를 구분하는 경우 비교는 대/소문자를 구분하지 않습니다.

SUSER_SNAME()를 사용하여 필터링

Adventure Works 샘플 데이터베이스의 Employee 테이블을 고려합니다. 이 테이블의 LoginID열에는 각 직원에 대한 로그인이 'domain\login' 형식으로 포함되어 있습니다. 직원이 관련 데이터만 받도록 이 테이블을 필터링하려면 다음의 필터 절을 지정합니다.

LoginID = SUSER_SNAME()  

예를 들어 값이 'adventure-works\john5'인 직원이 있습니다. 병합 에이전트가 게시자로 연결할 경우 구독을 만들 때 사용자가 지정한 로그인(이 경우 'adventure-works\john5')을 사용합니다. 그런 다음 병합 에이전트 SUSER_SNAME()에서 반환된 값을 테이블의 값과 비교하고 LoginID 열에 'adventure-works\john5' 값이 포함된 행만 다운로드합니다.

HOST_NAME()으로 필터링

HumanResources.Employee 테이블을 고려합니다. 이 테이블에 각 직원의 컴퓨터 이름이 'name_computertype' 형식인 ComputerName과 같은 열이 포함되어 있다고 가정합니다. 직원이 관련 데이터만 받도록 이 테이블을 필터링하려면 다음의 필터 절을 지정합니다.

ComputerName = HOST_NAME()  

예를 들어 직원 중 한 명의 값은 'john5_laptop'일 수 있습니다. 병합 에이전트 게시자에 연결하면 HOST_NAME()에서 반환된 값을 테이블의 값과 비교하고 ComputerName 열에 'john5_laptop' 값이 포함된 행만 다운로드합니다.

필터에서 함수를 결합할 수도 있습니다. 예를 들어 직원이 자신의 컴퓨터에서 로그인을 사용하는 경우에만 데이터를 수신하도록 하려면 필터 절은 다음과 같습니다.

LoginID = SUSER_SNAME() AND ComputerName = HOST_NAME()  

HOST_NAME() 값을 재정의하지 않을 경우 HOST_NAME()으로 필터링하는 방법은 일반적으로 끌어오기 구독에만 사용합니다. 함수에서 반환되는 값은 병합 에이전트 실행 중인 컴퓨터의 이름입니다. 끌어오기 구독의 경우 각 구독에 대해 값이 다르지만 밀어넣기 구독의 경우 값은 동일합니다(모든 병합 에이전트 밀어넣기 구독에 대해 배포자에서 실행됨).

Important

HOST_NAME() 함수의 값을 재정의할 수 있으므로 HOST_NAME()이 포함된 필터를 사용하여 데이터 파티션에 대한 액세스를 제어할 수 없습니다. 데이터 파티션에 대한 액세스를 제어하려면 SUSER_SNAME(), SUSER_SNAME()를 HOST_NAME()와 함께 사용하거나 정적 행 필터를 사용합니다.

HOST_NAME() 값 재정의

앞에서 설명한 대로 HOST_NAME()는 기본적으로 SQL Server 인스턴스에 연결하는 컴퓨터의 이름을 반환합니다. 매개 변수가 있는 필터를 사용하는 경우 구독을 만들 때 값을 제공하여 이 값을 재정의하는 것이 일반적입니다. 그러면 HOST_NAME() 함수는 컴퓨터 이름 대신 사용자가 지정한 값을 반환합니다.

참고 항목

HOST_NAME()를 재정의하는 경우 HOST_NAME() 함수에 대한 모든 호출은 지정한 값을 반환합니다. 다른 애플리케이션이 컴퓨터 이름을 반환하는 HOST_NAME()에 종속되지 않아야 합니다.

HumanResources.Employee 테이블을 고려합니다. 이 테이블에는 EmployeeID이 포함됩니다. 각 직원이 관련 데이터만 받도록 이 테이블을 필터링하려면 다음의 필터 절을 지정합니다.

EmployeeID = CONVERT(int,HOST_NAME())

예를 들어 직원 Pamela Ansman-Wolfe에게 직원 ID로 280을 할당합니다. 이 직원에 대한 구독을 만들 때 HOST_NAME() 값의 직원 ID 값(예제에서는 280)을 지정합니다. 병합 에이전트가 게시자로 연결하면 HOST_NAME()에서 반환된 값을 해당 테이블의 값과 비교한 다음 EmployeeID 열에 280이라는 값이 포함된 행만 다운로드합니다.

Important

HOST_NAME() 함수는 nchar 값을 반환하므로 위의 예제와 같이 필터 절의 열이 숫자 데이터 형식인 경우 CONVERT를 사용해야 합니다. 성능상의 이유로 다음과 같이 CONVERT(nchar,EmployeeID) = HOST_NAME()매개 변수가 있는 행 필터 절의 열 이름에 함수를 적용하지 않는 것이 좋습니다. 대신 예제 EmployeeID = CONVERT(int,HOST_NAME())에 표시된 방법을 사용하는 것이 좋습니다. 이 절은 sp_addmergearticle 매개 변수@subset_filterclause 사용할 수 있지만 일반적으로 새 게시 마법사에서 사용할 수 없습니다(마법사는 필터 절을 실행하여 유효성을 검사합니다. 컴퓨터 이름을 int로 변환할 수 없기 때문에 실패함). 새 게시 마법사를 사용할 경우 게시에 대한 스냅샷을 만들기 전에 마법사에서 CONVERT(nchar,EmployeeID) = HOST_NAME() 을 지정한 다음 sp_changemergearticle 을 사용하여 해당 절을 EmployeeID = CONVERT(int,HOST_NAME()) 로 변경하는 것이 좋습니다.

HOST_NAME() 값을 재정의하려면

다음 방법 중 하나를 사용하여 HOST_NAME() 값을 재정의합니다.

매개 변수가 있는 필터를 사용하여 게시에 대한 구독 초기화

매개 변수가 있는 행 필터가 병합 게시에 사용되는 경우 복제본(replica)tion은 두 부분으로 구성된 스냅샷 사용하여 각 구독을 초기화합니다. 자세한 내용은 매개 변수가 있는 필터를 사용하여 병합 게시에 대한 스냅샷을 참조 하세요.

적절한 필터링 옵션 사용

매개 변수가 있는 필터를 사용할 때 제어할 수 있는 두 가지 주요 영역이 있습니다.

  • 파티션 그룹 사용 및 파티션 변경 유지라는 두 게시 설정 중 하나로 제어되는 병합 복제본(replica)tion에서 필터를 처리하는 방법입니다.

  • 파티션 옵션을 설정하는 문서에서 반영해야 하는 구독자 간에 데이터를 공유하는 방법입니다.

필터링 옵션을 설정하려면 매개 변수가 있는 행 필터 최적화를 참조 하세요.

'use partition groups' 및 'keep partition changes' 설정

use partition groupskeep partition changes 옵션은 모두 게시 데이터베이스에 추가 메타데이터를 저장하여 필터링된 아티클이 있는 게시에 대한 동기화 성능을 향상시킵니다. use partition groups 옵션은 사전 계산 파티션 기능을 사용하여 더욱 향상된 성능을 제공합니다. 게시의 아티클이 요구 사항 집합을 준수하는 경우 이 옵션은 기본적으로 true로 설정됩니다. 이러한 요구 사항에 대한 자세한 내용은 사전 계산 파티션으로 매개 변수가 있는 필터 성능 최적화를 참조하세요. 아티클이 사전 계산 파티션을 사용하기 위한 요구 사항을 충족하지 않는 경우 파티션 변경 내용 유지 옵션이 true설정됩니다.

'파티션 옵션' 설정

필터링된 테이블의 데이터를 구독자가 공유하는 방식에 따라 아티클을 만들 때 파티션 옵션 속성의 값을 지정합니다. 속성은 sp_addmergearticle, sp_changemergearticle아티클 속성 대화 상자를 사용하여 네 가지 값 중 하나로 설정할 수 있습니다. 새 게시 마법사 및 게시 속성 대화 상자에서 사용할 수 있는 필터 추가 또는 필터 편집 대화 상자를 사용하여 두 값 중 하나로 속성을 설정할 수 있습니다. 다음 표에서는 사용 가능한 값을 요약합니다.

설명 필터 추가 및 필터 편집의 값 아티클 속성의 값 저장 프로시저의 값
파티션의 데이터가 겹치고 구독자는 매개 변수가 있는 필터에서 참조되는 열을 업데이트할 수 있습니다. 이 테이블의 행은 여러 구독으로 이동합니다. 겹치는 0
파티션의 데이터가 겹치며 구독자는 매개 변수가 있는 필터에서 참조되는 열을 업데이트할 수 없습니다. N/A* 겹침, 파티션 외부 데이터 변경 허용 불가 1
파티션의 데이터가 겹치지 않고 구독 간에 데이터가 공유됩니다. 구독자는 매개 변수가 있는 필터에서 참조되는 열을 업데이트할 수 없습니다. N/A* 겹치지 않음, 구독 간 공유 2
파티션에 있는 데이터는 겹치지 않으며 파티션당 하나의 구독이 있습니다. 구독자는 매개 변수가 있는 필터에서 참조된 열은 업데이트할 수 없습니다.** 이 테이블의 행은 하나의 구독으로만 이동합니다. 비오버랩, 단일 구독 3

*기본 필터링 옵션이 0 또는 1 또는 2설정된 경우 필터 추가 및 필터 편집 대화 상자에 이 테이블의 행이 여러 구독으로 이동합니다.

**이 옵션을 지정하는 경우 해당 문서의 각 데이터 파티션에 대해 단일 구독만 있을 수 있습니다. 새 구독의 필터링 기준이 기존 구독과 동일한 파티션으로 확인되는 두 번째 구독이 만들어지면 기존 구독이 삭제됩니다.

Important

파티션 옵션 값은 구독자가 데이터를 공유하는 방법에 따라 설정해야 합니다. 예를 들어 파티션이 파티션당 단일 구독으로 오버오버되지 않도록 지정하지만 다른 구독자에서 데이터가 업데이트되면 동기화 중에 병합 에이전트 실패할 수 있으며 비수렴이 발생할 수 있습니다.

적절한 파티션 옵션 선택

오버랩되지 않는 파티션은 미리 계산된 파티션과 함께 작동하여 일부 기능 제한이 허용되는 상황에서 성능을 향상시킵니다. 미리 계산된 파티션은 구독자에 대한 다운로드를 빠르게 하지만 업로드 속도가 느립니다. 파티션을 오버오버하지 않는 경우 미리 계산된 파티션과 관련된 업로드 비용이 최소화됩니다. 매개 변수가 있는 필터 및 사용된 조인 필터가 더 복잡할 때 비오버랩 파티션의 성능 이점이 더 두드러집니다.

게시에 사용할 파티션 옵션을 결정할 때 다음 시나리오를 고려합니다.

  • Adventure Works에는 지정된 우편 번호의 고객을 담당하는 각 영업 담당자가 있는 모바일 영업 인력이 있습니다. 애플리케이션에서는 고객이 한 판매 지역에서 다른 판매 지역으로 이동하는 경우 우편 번호를 업데이트하여 고객이 다른 영업 담당자에게 할당되도록 해야 합니다. 매개 변수가 있는 필터는 고객의 우편 번호를 기반으로 하며, 업데이트는 한 영업 사원의 파티션에서 우편 번호를 제거하고 다른 영업 사원의 파티션에 삽입합니다. 이렇게 하려면 매개 변수가 있는 필터에서 참조되는 열을 업데이트할 수 있는 겹치는 파티션이 필요합니다. 이 옵션은 유연성을 최대화하지만 파티션을 오버오버하지 않고도 수행되지 않을 수 있습니다.

  • 고용 기관에는 각 주의 각 카운티에 있는 지역 사무소에 제공되는 데이터가 있습니다. 데이터가 겹치지 않습니다. 에이전시 본사 테이블의 각 행은 하나의 파티션에만 포함되지만 해당 파티션은 동일한 카운티의 여러 사무실로 전송됩니다. 구독 간에 공유되는 파티션이 있는 오버랩되지 않는 파티션 옵션이 적절하므로 애플리케이션 요구 사항을 충족하면서 겹치는 파티션에 비해 성능이 향상됩니다.

  • 겹치지 않는 파티션이 있고 하나의 구독만이 파티션에서 데이터를 받고 업데이트할 경우 더 많은 성능상의 이점이 있습니다. 이 시나리오는 POS(Point of Sale) 시스템 및 구독자에서 주로 데이터를 수집하여 게시자로 업로드하는 FF(Field Force) 애플리케이션에 적합합니다. 배달 애플리케이션의 Package 테이블을 고려해 보십시오. 각 패키지가 트럭에 실리면서 Package 테이블에서 패키지의 상태가 변경되고 해당 변경 내용은 다시 본사로 복제됩니다. 운전 기사는 두 대의 서로 다른 트럭에 실린 같은 패키지의 상태를 업데이트하지 않으므로 Package 테이블을 파티션당 하나의 구독이 있는 겹치지 않는 파티션으로 만들 수 있습니다.

겹치지 않는 파티션에 대한 고려 사항

오버랩되지 않는 파티션을 사용할 때는 다음 사항을 고려해야 합니다.

일반적인 고려 사항
  • 게시는 미리 계산된 파티션을 사용해야 합니다.

  • 행은 하나의 파티션에만 속해야 합니다.

  • 아티클은 논리 레코드의 일부가 될 수 없습니다.

  • 대체 동기화 파트너는 지원되지 않습니다(이 기능은 사용되지 않음).

  • 구독자는 매개 변수가 있는 필터에서 참조되는 열을 업데이트할 수 없습니다.

  • 구독자의 삽입이 파티션에 속하지 않으면 삭제되지 않습니다. 다른 구독자로 복제되지 않습니다.

  • 겹치는 파티션을 사용하는 일부 환경에서 병합 에이전트가 데이터를 삽입하면 ID 범위가 조정됩니다. 파티션을 오버오버하지 않는 경우 구독 데이터베이스에서 ID 범위를 조정할 수 있는 권한이 있는 사용자가 삽입하는 동안에만 범위를 조정할 수 있습니다. 사용자는 테이블을 소유하거나 sysadmin 고정 서버 역할, db_owner 고정 데이터베이스 역할 또는 db_ddladmin 고정 데이터베이스 역할의 멤버여야 합니다.

파티션당 단일 구독이 있는 비오버랩 파티션에 대한 추가 고려 사항
  • 아티클은 하나의 게시에만 존재할 수 있습니다. 문서를 다시 게시할 수 없습니다.

  • 게시는 구독자가 스냅샷 프로세스를 시작하도록 허용해야 합니다. 자세한 내용은 매개 변수가 있는 필터를 사용하여 병합 게시에 대한 스냅샷을 참조 하세요.

조인 필터에 대한 추가 고려 사항
  • 조인 필터 계층 구조에서 겹치는 파티션이 있는 아티클은 오버랩되지 않는 파티션이 있는 아티클 위에 나타날 수 없습니다. 즉 자식 아티클이 겹치지 않는 파티션을 사용하면 부모 아티클도 겹치지 않는 파티션을 사용해야 합니다. 조인 필터에 대한 자세한 내용은 조인 필터를 참조 하세요.

  • 매핑되지 않는 파티션이 자식인 조인 필터에는 조인 고유 키 속성이 1로 설정되어 있어야 합니다. 자세한 내용은 Join Filters를 참조하세요.

  • 아티클에는 매개 변수가 있는 필터 또는 조인 필터가 하나만 있어야 합니다. 매개 변수가 있는 필터가 있으면서 조인 필터에서 부모일 수 있습니다. 매개 변수가 있는 필터를 사용하고 조인 필터에서 자식이 되는 것은 허용되지 않습니다. 조인 필터가 두 개 이상일 수도 없습니다.

  • 게시자의 두 테이블에 조인 필터 관계가 있고 자식 테이블에는 부모 테이블에 없는 행이 있을 경우 부모 테이블에 없는 행을 삽입해도 관련된 행이 구독자로 다운로드되지 않습니다(겹치는 파티션의 경우 다운로드됨). 예를 들어 SalesOrderDetail 테이블에 SalesOrderHeader 테이블에 해당 행이 없는 행이 있고 SalesOrderHeader누락된 행을 삽입하면 행이 구독자로 다운로드되지만 SalesOrderDetail의 해당 행은 다운로드되지 않습니다.

참고 항목

시간 기반 행 필터에 대한 최상의 구현 방법
게시된 데이터 필터링
병합 복제의 게시된 데이터 필터링