다음을 통해 공유


연습: 필터링된 범위 정의 및 서버 데이터베이스 프로비전

테이블의 모든 행을 포함하지 않고 필터 값을 기준으로 하여 테이블의 행 하위 집합을 포함하는 범위를 만들면 유용합니다. 이 연습에서는 NC(노스캐롤라이나) 주에서 발생하는 주문을 포함하는 범위를 만듭니다.

연습: 범위 정의 및 서버 프로비전 연습에서 이미 ProductsScope 범위를 정의하고 범위와 관련된 아티팩트를 사용하여 서버 데이터베이스 SyncDB를 프로비전하는 콘솔 응용 프로그램을 만들었습니다. ProductsScope는 연결된 필터 없이 정의되었습니다. 이 연습에서는 필터링된 범위를 정의하고 범위와 관련된 아티팩트를 사용하여 서버 데이터베이스 SyncDB를 프로비전하는 콘솔 응용 프로그램을 만듭니다.

범위는 한 단위로 동기화되는 테이블 집합입니다. 이러한 테이블의 일부 또는 전부가 필터링될 수 있습니다. 필터가 지정된 테이블이 하나 이상 있는 범위를 필터링된 범위라고 합니다. 이 연습에서는 OriginState 열 값이 NC로 설정된 Orders 테이블에 저장된 주문이 들어 있는 이름이 OrdersScope-NC인 필터링된 범위를 정의합니다.

동기화 범위의 테이블은 데이터베이스에 이미 있거나 Sync Framework 개체 모델을 사용하여 설명된 후 기본 저장소가 동기화될 때 런타임에 생성될 수 있습니다. 이 연습에서는 서버 데이터베이스에 이미 있는 Orders 테이블을 사용합니다.

데이터베이스 프로비전 작업에는 추적 테이블, 트리거 및 저장 프로시저와 같은 동기화 범위 관련 아티팩트를 데이터베이스에 추가하는 과정이 포함되어 있습니다. 이러한 아티팩트는 런타임에 동기화 프로세스에서 사용됩니다. 필요한 경우 앞 단락에서 명시한 대로 데이터베이스에 기본 테이블이 추가되기도 합니다.

필터링된 범위 프로비전에 대한 보다 자세한 기술 정보는 방법: 데이터베이스 동기화를 위한 데이터 필터링(SQL Server)을 참조하십시오.

필터링된 범위를 정의하고 서버를 프로비전하려면

  1. 솔루션 탐색기에서 **솔루션 ‘SyncSQLServerAndSQLExpress’**를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 프로젝트를 클릭합니다.

  2. 프로젝트 형식에서 **Visual C#**을 선택하고 템플릿에서 콘솔 응용 프로그램을 선택합니다.

  3. 프로젝트 이름ProvisionServerWithFilteredScope를 입력합니다.

  4. 확인을 클릭하여 새 프로젝트 대화 상자를 닫습니다.

  5. 솔루션 탐색기 창에서 ProvisionServerWithFilteredScope를 마우스 오른쪽 단추로 클릭한 다음 참조 추가를 클릭합니다.

  6. Microsoft.Synchronization, Microsoft.Synchornization.Data, Microsoft.Synchronization.Data.SqlServer를 선택하고 확인을 클릭하여 참조 추가 대화 상자를 닫습니다.

  7. Program.cs 파일 시작 부분에서 기존 using 문 다음에 아래의 using 문을 추가합니다.

    using System.Data;
    using System.Data.SqlClient;
    
    using Microsoft.Synchronization;
    using Microsoft.Synchronization.Data;
    using Microsoft.Synchronization.Data.SqlServer;
    
  8. 다음 문을 Main 메서드에 추가하여 서버 데이터베이스에 대한 SQL 연결을 만듭니다.

    SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
    

    중요

    기본 인스턴스를 사용하지 않는 경우 위의 문에서 서버 이름을 사용자 서버의 인스턴스 이름으로 바꿉니다. 예를 들어 SQL Server 인스턴스의 이름이 MYSQLINSTANCE인 경우 (로컬)을 .\MYSQLINSTANCE로 바꿉니다.

  9. 다음 코드를 Main 메서드에 추가하여 SyncDB 데이터베이스의 Orders 테이블을 기준으로 하는 동기화 범위를 만듭니다. 이 코드에서는 동기화 범위를 만들고, SyncDB 서버 데이터베이스에서 Orders 테이블에 대한 설명을 가져오고, 동기화 범위 정의에 테이블 설명을 추가합니다. 다음 목록에는 필터링된 동기화 범위와 관련된 아티팩트를 사용하여 서버 데이터베이스를 프로비전하는 세부 단계가 포함되어 있습니다.

    1. DbSyncScopeDescription 클래스의 인스턴스를 만듭니다. DbSyncScopeDescription 클래스를 사용하여 동기화 범위의 이름 및 동기화할 테이블 목록을 지정합니다. 테이블은 DbSyncTableDescription 클래스를 사용하여 지정됩니다.

    2. SyncDB 서버 데이터베이스에서 검색된 Orders 테이블의 스키마를 기준으로 하는 DbSyncTableDescription 클래스의 인스턴스를 만듭니다. DbSyncTableDescription 클래스를 사용하여 테이블 이름, 동기화할 테이블의 열, 테이블의 데이터 형식, 동기화에 필요한 기타 정보를 지정합니다. 이러한 정보는 명시적으로 지정하거나 GetDescriptionForTable(String, SqlConnection) 메서드를 사용하여 데이터베이스를 쿼리함으로써 얻을 수 있습니다.

      이 연습에서는 SqlSyncDescriptionBuilder 클래스의 GetDescriptionForTable(String, SqlConnection) 메서드를 사용하여 테이블에 대한 설명을 검색합니다.

    3. Add 메서드를 사용하여 DbSyncScopeDescription 개체의 Tables 컬렉션에 DbSyncTableDescription 개체를 추가합니다.

    // define the OrdersScope-NC filtered scope 
    // this scope filters records in the Orders table with OriginState set to NC
    DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("OrdersScope-NC");
    
    // get the description of the Orders table and add it to the scope
    DbSyncTableDescription tableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Orders", serverConn);
    scopeDesc.Tables.Add(tableDesc);
    
  10. 다음 코드를 Main 메서드에 추가하여 동기화 관련 아티팩트를 통해 SyncDB 서버 데이터베이스를 프로비전합니다. 이 코드에서는 SqlSyncScopeProvisioning 개체를 만들고, 서버에 테이블이 이미 있으므로 테이블 만들기 플래그를 Skip으로 설정하고, OriginState 열을 값이 NC로 설정된 필터 열로 설정하고, 프로비전 프로세스를 시작합니다.

    1. DbSyncScopeDescription 개체를 기준으로 하는 SqlSyncScopeProvisioning 클래스의 인스턴스를 만들고 서버 데이터베이스에 대한 연결을 만듭니다. SqlSyncScopeProvisioning 클래스는 DbSyncScopeDescription 개체에서 나타내는 특정 범위에 대한 SQL Server 데이터베이스의 프로비전을 표시합니다.

    2. 서버 데이터베이스에 Orders 테이블이 이미 있으므로 DbSyncCreationOption 값을 Skip으로 지정하여 SetCreateTableDefault(DbSyncCreationOption) 메서드를 호출합니다. SetCreateTableDefault(DbSyncCreationOption) 메서드를 사용하여 범위가 구성된 경우 기본 테이블을 만들지 여부를 지정합니다.

    3. Orders 테이블의 OriginState 열을 필터 열로 지정하고 "OriginState = 'NC'"를 테이블에 대한 필터 절로 지정합니다. AddFilterColumn(String) 메서드를 통해 FilterClause 속성에서 지정한 필터 절에 사용되는 열을 추가할 수 있습니다. 이러한 필터 열은 기본 테이블에 대한 변경 내용을 추적하는 추적 테이블에 추가됩니다. 필터 절은 WHERE 키워드가 없는 WHERE 절이며, [side] 별칭은 추적 테이블의 별칭입니다. Orders 테이블과 연결된 SqlSyncTableProvisioning 개체에서 이러한 멤버를 호출합니다.

    4. SqlSyncScopeProvisioning 개체에서 Apply() 메서드를 호출하여 서버 데이터베이스의 변경 내용 추적 인프라를 만드는 프로비전 프로세스를 시작합니다.

    // create server provisioning object
    SqlSyncScopeProvisioning serverProvision = new SqlSyncScopeProvisioning(serverConn, scopeDesc);
    
    // no need to create the Orders table since it already exists, 
    // so use the Skip parameter
    serverProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);
    
    // set the filter column on the Orders table to OriginState
    serverProvision.Tables["Orders"].AddFilterColumn("OriginState");
    
    // set the filter value to NC
    serverProvision.Tables["Orders"].FilterClause = "[side].[OriginState] = 'NC'";
    
    // start the provisioning process
    serverProvision.Apply();
    
  11. 솔루션 탐색기에서 ProvisionServerWithFilteredScope를 마우스 오른쪽 단추로 클릭하고 빌드를 선택합니다.

  12. 솔루션 탐색기에서 ProvisionServerWithFilteredScope를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택합니다.

  13. Ctrl+F5를 눌러 프로그램을 실행합니다.

  14. Enter 키를 눌러 명령 프롬프트 창을 닫습니다.

  15. SQL Server Management Studio에서 SyncDB 노드와 테이블을 차례로 확장합니다. 이 경우 프로비전 프로세스에서 만든 Orders_Tracking 테이블이 표시되어야 합니다. 프로비전 프로세스에서 만든 트리거 및 저장 프로시저와 같은 다른 개체도 있습니다.

  16. 다음 연습을 수행하기 위해 Visual Studio를 열어 둡니다.

전체 코드 예제

using System;
using System.Data;
using System.Data.SqlClient;

using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;

namespace ProvisionServerWithFilteredScope
{
    class Program
    {
        static void Main(string[] args)
        {
            // create a connection to the server database
            SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");

            // define the OrdersScope-NC filtered scope 
            // this scope filters records in the Orders table with OriginState set to NC
            DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("OrdersScope-NC");

            // get the description of the Orders table and add it to the scope
            DbSyncTableDescription tableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Orders", serverConn);
            scopeDesc.Tables.Add(tableDesc);

           // create server provisioning object
            SqlSyncScopeProvisioning serverProvision = new SqlSyncScopeProvisioning(serverConn, scopeDesc);

            // no need to create the Orders table since it already exists, 
            // so use the Skip parameter
            serverProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);

            // set the filter column on the Orders table to OriginState
            serverProvision.Tables["Orders"].AddFilterColumn("OriginState");

            // set the filter value to NC
            serverProvision.Tables["Orders"].FilterClause = "[side].[OriginState] = 'NC'";

            // start the provisioning process
            serverProvision.Apply();
        }
    }
}

참고 항목

개념

방법: 데이터베이스 동기화를 위한 데이터 필터링(SQL Server)