다음을 통해 공유


Replication Management Objects Concepts

적용 대상: SQL Server Azure SQL Managed Instance

RMO(복제 관리 개체)는 SQL Server에 대한 복제 기능을 캡슐화하는 관리 코드 어셈블리입니다. RMO는 네임스페이스에 Microsoft.SqlServer.Replication 의해 구현됩니다.

다음 섹션의 항목에서는 RMO를 사용하여 복제 작업을 프로그래밍 방식으로 제어하는 방법을 설명합니다.

배포 구성
이 섹션의 항목에서는 RMO를 사용하여 게시 및 배포를 구성하는 방법을 보여 줍니다.

게시 만들기
이 섹션의 항목에서는 RMO를 사용하여 게시 및 아티클을 작성, 삭제 및 수정하는 방법을 보여 줍니다.

게시 구독
이 섹션의 항목에서는 RMO를 사용하여 구독을 만들고 삭제하고 수정하는 방법을 보여 줍니다.

복제 토폴로지 보안 설정
이 섹션의 항목에서는 RMO를 사용하여 보안 설정을 보고 수정하는 방법을 보여 줍니다.

구독 동기화(복제)
이 섹션의 항목에서는 구독을 동기화하는 방법을 보여 줍니다.

복제 모니터링
이 섹션의 항목에서는 복제 토폴로지를 프로그래밍 방식으로 모니터링하는 방법을 보여 줍니다.

RMO 프로그래밍 소개

RMO는 SQL Server 복제의 모든 측면을 프로그래밍하도록 설계되었습니다. RMO 네임스페이스는 Microsoft.SqlServer.ReplicationMicrosoft .NET Framework 어셈블리인 Microsoft.SqlServer.Rmo.dll 의해 구현됩니다. 네임스페이스에 속하는 Microsoft.SqlServer.Replication Microsoft.SqlServer.Replication.dll 어셈블리는 다양한 복제 에이전트(스냅샷 에이전트, 배포 에이전트 및 병합 에이전트)를 프로그래밍하기 위한 관리 코드 인터페이스를 구현합니다. 해당 클래스는 RMO에서 액세스하여 구독을 동기화할 수 있습니다. Microsoft.SqlServer.Replication.BusinessLogicSupport.dll 어셈블리에서 Microsoft.SqlServer.Replication.BusinessLogicSupport 구현된 네임스페이스의 클래스는 병합 복제를 위한 사용자 지정 비즈니스 논리를 만드는 데 사용됩니다. 이 어셈블리는 RMO와 독립적입니다.

RMO를 기반으로 애플리케이션 배포

RMO는 SQL Server Compact를 제외한 모든 버전의 SQL Server에 포함된 복제 구성 요소 및 클라이언트 연결 구성 요소에 따라 달라집니다. RMO를 기반으로 애플리케이션을 배포하려면 애플리케이션이 실행될 컴퓨터에 복제 구성 요소 및 클라이언트 연결 구성 요소가 포함된 SQL Server 버전을 설치해야 합니다.

RMO 시작

이 섹션에서는 Microsoft Visual Studio를 사용하여 간단한 RMO 프로젝트를 시작하는 방법을 설명합니다.

새 Microsoft Visual C# 프로젝트를 만들려면

  1. Visual Studio를 시작합니다.

  2. 파일 메뉴에서 NewProject를 클릭합니다. 새 프로젝트 대화 상자가 나타납니다.

  3. 프로젝트 형식 대화 상자에서 Visual C# 프로젝트를 선택합니다. 템플릿 창에서 Windows 애플리케이션을 선택합니다.

  4. (선택 사항) 이름새 애플리케이션의 이름을 입력합니다.

  5. 확인을 클릭하여 Visual C# Windows 템플릿을 로드합니다.

  6. 프로젝트 메뉴에서 참조 항목 추가를 선택합니다. 참조 추가 대화 상자가 나타납니다.

  7. .NET 탭의 목록에서 다음 어셈블리를 선택한 다음 확인을 클릭합니다.

    • Microsoft.SqlServer.Replication .NET 프로그래밍 인터페이스

    • Microsoft.SqlServer.ConnectionInfo

    • Replication Agent Library

    참고 항목

    Ctrl 키를 사용하여 둘 이상의 파일을 선택합니다.

  8. (선택 사항) 6단계를 반복합니다. 찾아보기 탭을 클릭하고 C:\Program Files\Microsoft SQL Server\nnn\COM으로 이동하여 Microsoft.SqlServer.Replication.BusinessLogicSupport.dll 선택한 다음 확인을 클릭합니다.

  9. 보기 메뉴에서 코드를 클릭합니다.

  10. 코드에서 네임스페이스 문 앞에 다음 using 문을 입력하여 RMO 네임스페이스의 형식을 한정합니다.

    // These namespaces are required.  
    using Microsoft.SqlServer.Replication;  
    using Microsoft.SqlServer.Management.Common;  
    // This namespace is only used when creating custom business  
    // logic for merge replication.  
    using Microsoft.SqlServer.Replication.BusinessLogicSupport;   
    

새 Microsoft Visual Basic .NET 프로젝트를 만들려면

  1. Visual Studio를 시작합니다.

  2. 파일 메뉴에서 새 프로젝트를 선택합니다. 새 프로젝트 대화 상자가 나타납니다.

  3. 프로젝트 형식 창에서 Visual Basic을 선택합니다. 템플릿 창에서 Windows 애플리케이션을 선택합니다.

  4. (선택 사항) 이름 상자에 새 애플리케이션의 이름을 입력합니다.

  5. 확인을 클릭하여 Visual Basic Windows 템플릿을 로드합니다.

  6. 프로젝트 메뉴에서 참조 추가를 선택합니다. 참조 추가 대화 상자가 나타납니다.

  7. .NET 탭의 목록에서 다음 어셈블리를 선택한 다음 확인을 클릭합니다.

    • Microsoft.SqlServer.Replication .NET 프로그래밍 인터페이스

    • Microsoft.SqlServer.ConnectionInfo

    • Replication Agent Library

    참고 항목

    Ctrl 키를 사용하여 둘 이상의 파일을 선택합니다.

  8. (선택 사항) 6단계를 반복합니다. 찾아보기 탭을 클릭하고 C:\Program Files\Microsoft SQL Server\nnn\COM으로 이동하여 Microsoft.SqlServer.Replication.BusinessLogicSupport.dll 선택한 다음 확인을 클릭합니다.

  9. 보기 메뉴에서 코드를 클릭합니다.

  10. 코드에서 선언 앞에 다음 Imports 문을 입력하여 RMO 네임스페이스의 형식을 한정합니다.

    ' These namespaces are required.  
    Imports Microsoft.SqlServer.Replication  
    Imports Microsoft.SqlServer.Management.Common  
    ' This namespace is only used when creating custom business  
    ' logic for merge replication.  
    Imports Microsoft.SqlServer.Replication.BusinessLogicSupport   
    

복제 서버에 연결

RMO 프로그래밍 개체를 사용하려면 클래스 인스턴스를 사용하여 SQL Server 인스턴스에 ServerConnection 연결해야 합니다. 서버에 대한 이 연결은 RMO 프로그래밍 개체와 독립적으로 수행됩니다. 그런 다음 인스턴스를 만드는 동안 또는 개체의 t 속성에 할당하여 P:Microsoft.SqlServer.Replication.ReplicationObject.ConnectionContexRMO 개체에 전달됩니다. 이러한 방식으로 RMO 프로그래밍 개체와 연결 개체 인스턴스를 별도로 만들고 관리할 수 있으며 단일 연결 개체를 여러 RMO 프로그래밍 개체와 함께 다시 사용할 수 있습니다. 복제 서버에 대한 연결에는 다음 규칙이 적용됩니다.

  • 지정된 ServerConnection 개체에 대해 모든 연결 속성을 정의합니다.

  • SQL Server의 각 인스턴스에 대한 연결에는 고유한 ServerConnection 개체가 있어야 합니다.

  • 개체는 ServerConnection 서버에서 P:Microsoft.SqlServer.Replication.ReplicationObject.ConnectionContext 만들거나 액세스하는 RMO 프로그래밍 개체의 속성에 할당됩니다.

  • 이 메서드는 Connect 서버에 대한 연결을 엽니다. 이 메서드는 서버에 액세스하는 다른 모든 메서드를 호출하기 전에 해당 연결을 사용하는 RMO 프로그래밍 개체에 대해 호출해야 합니다.

  • RMO와 SMO(SQL Server Management Objects)는 모두 SQL Server에 대한 연결에 클래스를 사용 ServerConnection 하므로 RMO 및 SMO 개체 모두에서 동일한 연결을 사용할 수 있습니다. 자세한 내용은 SQL Server 인스턴스에 연결을 참조 하세요.

  • 서버에 연결하고 성공적으로 로그인하기 위해 모든 인증 정보를 ServerConnection 개체에 제공합니다.

  • Windows 인증이 기본값입니다. SQL Server 인증 LoginSecure 을 사용하려면 false설정해야 하며 Login Password 유효한 SQL Server 로그온 및 암호로 설정해야 합니다. 보안 자격 증명은 항상 안전하게 저장 및 처리되어야 하며 가능한 한 런타임에 제공해야 합니다.

  • 다중 스레드 애플리케이션의 경우 각 스레드에서 별도의 ServerConnection 개체를 사용해야 합니다.

RMO 개체에서 사용하는 활성 서버 연결을 닫으려면 Disconnect 개체에 대해 ServerConnection 메서드를 호출합니다.

RMO 속성 설정

RMO 프로그래밍 개체의 속성은 서버에 있는 이러한 복제 개체의 속성을 나타냅니다. 서버에서 새 복제 개체를 만들 경우 이러한 개체는 RMO 속성을 사용하여 정의됩니다. 기존 개체의 경우 RMO 속성은 쓰기 가능하거나 설정할 수 있는 속성에 대해서만 수정할 수 있는 기존 개체의 속성을 나타냅니다. 속성은 새 개체 또는 기존 개체에 설정할 수 있습니다.

새 복제 개체의 속성 설정

서버에서 새 복제 개체를 만들 때 개체의 Create 메서드를 호출하기 전에 필요한 모든 속성을 지정해야 합니다. 새 복제 개체의 속성을 설정하는 방법은 게시 및 배포 구성을 참조하세요.

기존 복제 개체에 대한 속성 설정

서버에 있는 기존 복제 개체의 경우 개체에 따라 RMO에서 해당 개체의 속성 전체 또는 일부의 변경을 지원하는지 여부가 달라집니다. 쓰기 가능 또는 설정 가능한 속성만 변경할 수 있습니다. 속성을 변경 하려면 먼저 Load 또는 메서드를 M:Microsoft.SqlServer.Replication.ReplicationObject.LoadProperties 호출하여 서버에서 현재 속성을 가져와야 합니다. 이러한 메서드를 호출하면 기존 개체가 수정되고 있음을 나타냅니다.

기본적으로 개체 속성을 변경할 때 RMO는 사용 중인 실행 모드 ServerConnection 에 따라 이러한 변경 내용을 서버에 커밋합니다. 이 P:Microsoft.SqlServer.Replication.ReplicationObject.IsExistingObject 메서드를 사용하여 속성을 검색하거나 변경하기 전에 개체가 서버에 있는지 확인할 수 있습니다. 복제 개체의 속성을 변경하는 방법에 대한 자세한 내용은 배포자 및 게시자 속성 보기 및 수정을 참조 하세요.

참고 항목

여러 RMO 클라이언트 또는 RMO 프로그래밍 개체의 여러 인스턴스가 서버 에서 동일한 복제 개체에 액세스하는 경우 RMO 개체의 Refresh 메서드를 호출하여 서버에서 개체의 현재 상태에 따라 속성을 업데이트할 수 있습니다.

캐싱 속성 변경 내용

속성이 SqlExecutionModes RMO에서 CaptureSql 생성된 모든 Transact-SQL 문으로 설정된 경우 실행 방법 중 하나를 사용하여 단일 일괄 처리에서 수동으로 실행할 수 있도록 캡처됩니다. RMO를 사용하면 개체의 메서드를 사용하여 M:Microsoft.SqlServer.Replication.ReplicationObject.CommitPropertyChanges 속성 변경 내용을 캐시하고 단일 일괄 처리로 함께 커밋할 수 있습니다. 속성 변경 내용을 P:Microsoft.SqlServer.Replication.ReplicationObject.CachePropertyChanges 캐시하려면 개체의 속성을 true설정해야 합니다. RMO에서 캐싱 속성이 변경되면 개체는 ServerConnection 변경 내용이 서버로 전송되는 시기를 계속 제어합니다. 복제 개체의 속성 변경 내용을 캐싱하는 방법에 대한 자세한 내용은 배포자 및 게시자 속성 보기 및 수정을 참조 하세요.

Important

클래스는 ServerConnection 속성을 설정할 때 명시적 트랜잭션 선언을 지원하지만 이러한 트랜잭션은 내부 복제 트랜잭션을 방해할 수 있으며 예기치 않은 결과를 생성할 수 있으며 RMO와 함께 사용하면 안 됩니다.

RMO 구성 요소에 TLS 1.2 지원 사용

Windows 2012 및 이하 버전의 RMO 구성 요소에 대한 TLS 1.2 지원은 KB 3140245 업데이트를 설치하고 이 문서에서 언급한 대로 레지스트리 키를 만들어 활성화할 수 있습니다. Windows 2012 R2 이상 버전에서는 위의 문서에서 설명한 대로 레지스트리 키만 만들어야 합니다.

예시

이 예제에서는 속성 변경의 캐싱을 보여 줍니다. 여기서 트랜잭션 게시의 특성에 대한 변경 내용은 서버에 명시적으로 전송되기 전까지 캐시됩니다.

// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";

TransPublication publication;

// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);

try
{
    // Connect to the Publisher.
    conn.Connect();

    // Set the required properties for the publication.
    publication = new TransPublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    // Explicitly enable caching of property changes on this object.
    publication.CachePropertyChanges = true;

    // If we can't get the properties for this publication, 
    // throw an application exception.
    if (publication.LoadProperties())
    {
        // Enable support for push subscriptions and disable support 
        // for pull subscriptions.
        if ((publication.Attributes & PublicationAttributes.AllowPull) != 0)
        {
            publication.Attributes ^= PublicationAttributes.AllowPull;
        }
        if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
        {
            publication.Attributes |= PublicationAttributes.AllowPush;
        }

        // Send changes to the server.
        publication.CommitPropertyChanges();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "Settings could not be retrieved for the publication. " +
            "Ensure that the publication {0} exists on {1}.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Do error handling here.
    throw new ApplicationException(
        "The publication property could not be changed.", ex);
}
finally
{
    conn.Disconnect();
}