병합 아티클용 사용자 지정 충돌 해결 프로그램 구현Implement a Custom Conflict Resolver for a Merge Article

이 항목에서는 또는 COM 기반 사용자 지정 해결 프로그램 SQL Server 2017SQL Server 2017을 사용하여 Transact-SQLTransact-SQL 의 병합 아티클을 위한 사용자 지정 충돌 해결 프로그램을 구현하는 방법에 대해 설명합니다.This topic describes how to implement custom conflict resolver for a merge article in SQL Server 2017SQL Server 2017 by using Transact-SQLTransact-SQL or a COM-based custom resolver.

항목 내용In This Topic

Transact-SQL 사용 Using Transact-SQL

각 게시자에서 사용자 지정 충돌 해결 프로그램을 Transact-SQLTransact-SQL 저장 프로시저로 작성할 수 있습니다.You can write your own custom conflict resolver as a Transact-SQLTransact-SQL stored procedure at each Publisher. 동기화하는 동안 해결 프로그램이 등록된 아티클에서 충돌이 발생하면 이 저장 프로시저가 호출되고 병합 에이전트가 충돌 행에 대한 정보를 프로시저의 필수 매개 변수에 전달합니다.During synchronization, this stored procedure is invoked when conflicts are encountered in an article to which the resolver was registered, and information on the conflict row is passed by the Merge Agent to the required parameters of the procedure. 저장 프로시저 기반 사용자 지정 충돌 해결 프로그램은 항상 게시자에서 만들어집니다.Stored procedure-based custom conflict resolvers are always created at the Publisher.

참고

MicrosoftMicrosoft SQL ServerSQL Server 저장 프로시저 해결 프로그램은 행 변경에 따른 충돌을 처리할 때만 호출됩니다. SQL ServerSQL Server stored procedure resolvers are only invoked to handle row change-based conflicts. PRIMARY KEY 위반 또는 고유 인덱스 제약 조건 위반으로 인한 삽입 실패와 같은 다른 충돌 유형을 처리하는 데 사용할 수 없습니다.They cannot be used to handle other types of conflicts such as insert failures due to PRIMARY KEY violations or unique index constraint violations.

저장 프로시저 기반 사용자 지정 충돌 해결 프로그램을 만들려면To create a stored procedure-based custom conflict resolver

  1. 게시 또는 msdb 데이터베이스에 있는 게시자에서 다음 필수 매개 변수를 구현하는 새 시스템 저장 프로시저를 만듭니다.At the Publisher in either the publication or msdb database, create a new system stored procedure that implements the following required parameters:

    매개 변수Parameter 데이터 형식Data type DescriptionDescription
    @tableowner sysnamesysname 충돌을 해결 중인 테이블의 소유자 이름.Name of the owner of the table for which a conflict is being resolved. 게시 데이터베이스에 있는 테이블의 소유자입니다.This is the owner for the table in the publication database.
    @tablename sysnamesysname 충돌을 해결 중인 테이블의 이름Name of the table for which a conflict is being resolved.
    @rowguid uniqueidentifieruniqueidentifier 충돌이 있는 행의 고유 식별자Unique identifier for the row having the conflict.
    @subscriber sysnamesysname 충돌 변경 내용을 전파 중인 서버의 이름Name of the server from where a conflicting change is being propagated.
    @subscriber_db sysnamesysname 충돌 변경 내용을 전파 중인 데이터베이스의 이름Name of the database from where conflicting change is being propagated.
    @log_conflict OUTPUT@log_conflict OUTPUT intint 병합 프로세스에서 나중에 충돌을 해결할 수 있도록 충돌을 기록할지 여부를 나타냅니다.Whether the merge process should log a conflict for later resolution:

    0 = 충돌을 기록하지 않습니다.0 = Do not log the conflict.

    1 = 충돌 시 구독자의 변경 내용이 무시됩니다.1 = Subscriber is the conflict loser.

    2 = 충돌 시 게시자의 변경 내용이 무시됩니다.2 = Publisher is the conflict loser.
    @conflict_message OUTPUT@conflict_message OUTPUT nvarchar(512)nvarchar(512) 충돌을 기록할 경우 해결 정보로 제공되는 메시지Message to be given about the resolution if the conflict is logged.
    @destowner sysnamesysname 구독자에 있는 게시된 테이블의 소유자The owner of the published table at the Subscriber.

    이 저장 프로시저는 병합 에이전트가 이 매개 변수에 전달한 값을 사용하여 사용자 지정 충돌 해결 논리를 구현합니다. 이 저장 프로시저는 기본 테이블과 구조가 같고 충돌 시 적용되는 행의 데이터 값을 포함하는 단일 행 결과 집합을 반환해야 합니다.This stored procedure uses the values passed by the Merge Agent to these parameters to implement your custom conflict resolution logic; it must return a single row result set that is identical in structure to the base table and contains the data values for the winning version of the row.

  2. 게시자에 연결할 때 구독자가 사용하는 모든 로그인에 저장 프로시저에 대한 EXECUTE 권한을 부여합니다.Grant EXECUTE permissions on the stored procedure to any logins used by Subscribers to connect to the Publisher.

새 테이블 아티클에 사용자 지정 충돌 해결 프로그램을 사용하려면To use a custom conflict resolver with a new table article

  1. @article_resolver 매개 변수에 MicrosoftSQL Server Stored Procedure Resolver 값, @resolver_info 매개 변수에 충돌 해결 프로그램 논리를 구현하는 저장 프로시저 이름을 지정하여 sp_addmergearticle을 실행하고 아티클을 정의합니다.Execute sp_addmergearticle to define an article, specifying a value of MicrosoftSQL Server Stored Procedure Resolver for the @article_resolver parameter and the name of the stored procedure that implements the conflict resolver logic for the @resolver_info parameter. 자세한 내용은 Define an Article을 참조하세요.For more information, see Define an Article.

기존 테이블 아티클에 사용자 지정 충돌 해결 프로그램을 사용하려면To use a custom conflict resolver with an existing table article

  1. @publication, @article, @propertyarticle_resolver 값, @valueMicrosoftSQL Server Stored ProcedureResolver 값을 지정하여 sp_changemergearticle을 실행합니다.Execute sp_changemergearticle, specifying @publication, @article, a value of article_resolver for @property, and a value of MicrosoftSQL Server Stored ProcedureResolver for @value.

  2. @publication, @article, @propertyresolver_info 값, @value에 충돌 해결 프로그램 논리를 구현하는 저장 프로시저 이름을 지정하여 sp_changemergearticle을 실행합니다.Execute sp_changemergearticle, specifying @publication, @article, a value of resolver_info for @property, and the name of the stored procedure that implements the conflict resolver logic for @value.

COM 기반 사용자 지정 해결 프로그램 사용 Using a COM-based Custom Resolver

Microsoft.SqlServer.Replication.BusinessLogicSupport 네임스페이스는 이벤트를 처리하고 병합 복제 동기화 프로세스 중에 발생하는 충돌을 해결하는 복잡한 비즈니스 논리를 작성할 수 있게 해주는 인터페이스를 구현합니다.The Microsoft.SqlServer.Replication.BusinessLogicSupport namespace implements an interface that enables you to write complex business logic to handle events and resolve conflicts that occur during the merge replication synchronization process. 자세한 내용은 Implement a Business Logic Handler for a Merge Article을 참조하세요.For more information, see Implement a Business Logic Handler for a Merge Article. 네이티브 코드 기반 사용자 지정 비즈니스 논리를 직접 작성하여 충돌을 해결할 수도 있습니다.You can also write your own native code-based custom business logic to resolve conflicts. 이 논리는 MicrosoftMicrosoft Visual C++와 같은 제품을 사용하여 COM 구성 요소로 빌드되며 DLL(동적 연결 라이브러리)로 컴파일됩니다.This logic is built as a COM component and compiled into dynamic-link libraries (DLL), using products such as MicrosoftMicrosoft Visual C++. 이러한 COM 기반 사용자 지정 충돌 해결 프로그램은 충돌 해결을 위해 특별히 설계된 ICustomResolver 인터페이스를 구현해야 합니다.Such a COM–based custom conflict resolver must implement the ICustomResolver interface, which is designed specifically for conflict resolution.

COM 기반 사용자 지정 충돌 해결 프로그램을 만들고 등록하려면To create and register a COM-based custom conflict resolver

  1. COM 호환 제작 환경에서 사용자 지정 충돌 해결 프로그램 라이브러리에 대한 참조를 추가합니다.In a COM-compatible authoring environment, add references to the Custom Conflict Resolver library.

  2. Visual C++ 프로젝트의 경우 #import 지시어를 사용하여 이 라이브러리를 프로젝트로 가져옵니다.For a Visual C++ project, use the #import directive to import this library into your project.

  3. ICustomResolver 인터페이스를 구현하는 클래스를 만듭니다.Create a class that implements the ICustomResolver interface.

  4. 특정 메서드와 속성을 구현합니다.Implement certain methods and properties.

  5. 프로젝트를 빌드하여 사용자 지정 충돌 해결 프로그램 라이브러리 파일을 만듭니다.Build the project to create the custom conflict resolver library file.

  6. 병합 에이전트 실행 파일이 포함된 디렉터리에 라이브러리를 배포합니다(일반적으로 \Microsoft SQL Server\100\COM).Deploy the library in the directory containing the merge agent executable (usually \Microsoft SQL Server\100\COM).

    참고

    사용자 지정 충돌 해결 프로그램은 끌어오기 구독의 경우 구독자에, 밀어넣기 구독의 경우 배포자에, 또는 웹 동기화에 사용되는 웹 서버에 배포해야 합니다.A custom conflict resolver must be deployed at the Subscriber for a pull subscription, at the Distributor for a push subscription, or at the Web server used with Web synchronization.

  7. 배포 디렉터리에서 regsvr32.exe를 사용하여 다음과 같이 사용자 지정 충돌 해결 프로그램 라이브러리를 등록합니다.Register the custom conflict resolver library using regsvr32.exe from the deployment directory as follows:

    regsvr32.exe mycustomresolver.dll  
    
  8. 게시자에서 sp_enumcustomresolvers(Transact-SQL)를 실행하여 라이브러리가 이미 사용자 지정 충돌 해결 프로그램으로 등록되어 있지 않은지 확인합니다.At the Publisher, execute sp_enumcustomresolvers (Transact-SQL) to verify that the library is not already registered as a custom conflict resolver.

  9. 라이브러리를 사용자 지정 충돌 해결 프로그램으로 등록하려면 배포자에서 sp_registercustomresolver(Transact-SQL)를 실행합니다.To register the library as a custom conflict resolver, execute sp_registercustomresolver (Transact-SQL), at the Distributor. @article_resolver에 COM 개체 이름, @resolver_clsid에 라이브러리의 ID(CLSID), @is_dotnet_assemblyfalse 값을 지정합니다.Specify the friendly name of the COM object for @article_resolver, the library's ID (CLSID) for @resolver_clsid, and a value of false for @is_dotnet_assembly.

    참고

    사용자 지정 충돌 해결 프로그램이 더 이상 필요하지 않으면 sp_unregistercustomresolver(Transact-SQL)를 사용하여 등록을 취소할 수 있습니다.When no longer needed, a custom conflict resolver can be unregistered using sp_unregistercustomresolver (Transact-SQL).

  10. 필요에 따라 클러스터에서 5-8 단계를 반복하여 클러스터의 모든 노드에 사용자 지정 해결 프로그램을 등록합니다.(Optional) On a cluster, repeat steps 5-8 to register the custom resolver on all nodes of the cluster. 장애 조치 이후에 사용자 지정 해결 프로그램에서 조정자를 올바르게 로드하려면 이 단계가 필요합니다.This is required to ensure that the custom resolver will be able to properly load the reconciler following a failover.

새 테이블 아티클에 사용자 지정 충돌 해결 프로그램을 사용하려면To use a custom conflict resolver with a new table article

  1. 게시자에서 sp_enumcustomresolvers(Transact-SQL)를 실행하고 원하는 해결 프로그램의 이름을 확인합니다.At the Publisher, execute sp_enumcustomresolvers (Transact-SQL) and note the friendly name of the desired resolver.

  2. 게시 데이터베이스의 게시자에서 sp_addmergearticle(Transact-SQL)을 실행하여 아티클을 정의합니다.At the Publisher on the publication database, execute sp_addmergearticle (Transact-SQL) to define an article. @article_resolver에 1단계의 아티클 해결 프로그램 이름을 지정합니다.Specify the friendly name of the article resolver from step 1 for @article_resolver. 자세한 내용은 Define an Article을 참조하세요.For more information, see Define an Article.

기존 테이블 아티클에 사용자 지정 충돌 해결 프로그램을 사용하려면To use a custom conflict resolver with an existing table article

  1. 게시자에서 sp_enumcustomresolvers(Transact-SQL)를 실행하고 원하는 해결 프로그램의 이름을 확인합니다.At the Publisher, execute sp_enumcustomresolvers (Transact-SQL) and note the friendly name of the desired resolver.

  2. @publication, @article, @propertyarticle_resolver 값, @value에 1단계의 아티클 해결 프로그램 이름을 지정하여 sp_changemergearticle(Transact-SQL)을 실행합니다.Execute sp_changemergearticle (Transact-SQL), specifying @publication, @article, a value of article_resolver for @property, and the friendly name of the article resolver from step 1 for @value.

참고 항목See Also

Advanced Merge Replication Conflict Detection and Resolution Advanced Merge Replication Conflict Detection and Resolution
COM-Based Custom Resolvers COM-Based Custom Resolvers
Replication Security Best PracticesReplication Security Best Practices