복제 관리 개체 개념

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

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

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

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

  • 게시 구독
    이 섹션의 항목에서는 RMO를 사용하여 구독을 작성, 삭제 및 수정하는 방법을 보여 줍니다.

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

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

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

RMO 프로그래밍 소개

RMO는 SQL Server 복제의 모든 측면을 프로그래밍하기 위해 디자인되었습니다. RMO 네임스페이스는 Microsoft.SqlServer.Replication이며 이 네임스페이스는 Microsoft .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. 파일 메뉴에서 프로젝트를 클릭합니다. 새 프로젝트 대화 상자가 나타납니다.

  3. 프로젝트 형식 대화 상자에서 Visual C# 프로젝트를 선택합니다. 템플릿 창에서 Windows 응용 프로그램을 선택합니다.

  4. (옵션) 이름에 새 응용 프로그램의 이름을 입력합니다.

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

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

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

    • Microsoft.SqlServer.Replication .NET Programming Interface

    • Microsoft.SqlServer.ConnectionInfo

    • Replication Agent Library

    [!참고]

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

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

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

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

    // 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 Programming Interface

    • Microsoft.SqlServer.ConnectionInfo

    • Replication Agent Library

    [!참고]

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

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

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

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

    ' 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 프로그래밍 개체의 경우 ServerConnection 클래스의 인스턴스를 사용하여 SQL Server의 인스턴스에 연결해야 합니다. 이 서버 연결은 RMO 프로그래밍 개체와는 독립적으로 이루어집니다. 그런 다음에는 인스턴스 생성 중에 또는 개체의 ConnectionContext 속성을 할당하여 연결을 RMO 개체로 전달합니다. 이런 식으로 RMO 프로그래밍 개체와 연결 개체 인스턴스를 별도로 만들고 관리할 수 있으며 여러 RMO 프로그래밍 개체에서 단일 연결 개체를 다시 사용할 수 있습니다. 복제 서버에 대한 연결에는 다음 규칙이 적용됩니다.

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

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

  • ServerConnection 개체는 서버에서 생성되거나 액세스되는 RMO 프로그래밍 개체의 ConnectionContext 속성에 할당합니다.

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

  • RMO 및 SMO(SQL Server Management Objects) 모두 ServerConnection 클래스를 사용하여 SQL Server에 연결하기 때문에 RMO와 SMO 개체 모두가 동일한 연결을 사용할 수 있습니다. 자세한 내용은 SQL Server 인스턴스에 연결을 참조하십시오.

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

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

  • 다중 스레드 응용 프로그램의 경우 각 스레드에서 별도의 ServerConnection 개체를 사용해야 합니다.

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

RMO 속성 설정

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

새 복제 개체의 속성 설정

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

기존 복제 개체의 속성 설정

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

기본적으로 RMO는 개체 속성을 변경할 때 현재 사용 중인 ServerConnection의 실행 모드에 따라 변경 내용을 서버에 커밋합니다. IsExistingObject 메서드를 사용하면 개체의 속성을 검색하거나 변경하기 전에 해당 개체가 서버에 있는지 여부를 확인할 수 있습니다. 복제 개체의 속성을 변경하는 방법은 게시자 및 배포자 속성 보기 및 수정을 참조하십시오.

[!참고]

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

속성 변경 내용 캐시

SqlExecutionModes 속성을 CaptureSql로 설정하면 RMO에서 생성한 모든 Transact-SQL 문이 캡처됩니다. 이 경우 실행 메서드 중 하나를 사용하여 하나의 일괄 처리에서 문을 수동으로 실행할 수 있습니다. RMO를 사용하면 속성 변경 내용을 캐시한 후 개체의 CommitPropertyChanges 메서드를 사용하여 하나의 일괄 처리에서 한 번에 커밋할 수 있습니다. 속성 변경 내용을 캐시하려면 개체의 CachePropertyChanges 속성을 true로 설정해야 합니다. RMO의 속성 변경 내용을 캐시하는 경우에도 변경 내용이 서버에 전송되는 시점은 ServerConnection 개체에 의해 제어됩니다. 복제 개체의 속성 변경 내용을 캐시하는 방법은 게시자 및 배포자 속성 보기 및 수정을 참조하십시오.

중요 정보중요

속성을 설정할 때 ServerConnection 클래스를 사용하여 트랜잭션을 명시적으로 선언할 수 있지만 이러한 트랜잭션은 내부 복제 트랜잭션을 방해하여 예기치 않은 결과를 초래할 수 있기 때문에 RMO와 함께 사용하지 않는 것이 좋습니다.

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

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

            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();
            }

참고 항목

개념

복제 시스템 저장 프로시저 개념

복제 프로그래밍 개념