다음을 통해 공유


SqlTrackingService로 데이터 유지 관리

Windows Workflow Foundation에서는 SqlTrackingService에 대한 데이터 유지 관리 기능을 제공합니다. 이 기능을 통해 워크플로 인스턴스가 완료될 때 추적 데이터를 분할할 수 있습니다. 분할에는 실행이 완료된 워크플로 인스턴스에서 삽입된 추적 데이터를 파티션이라는 별도의 데이터베이스 테이블로 이동하는 작업이 포함됩니다. Windows Workflow Foundation에서는 분할을 위한 두 가지 체계를 제공하므로 워크플로 솔루션에 적합한 체계를 선택할 수 있습니다.

  • 완료 시 분할

  • 필요 시 분할

완료 시 분할

완료 시 분할은 작동이 중단되지 않고 작동 중단을 발생시키지 않으려는 응용 프로그램용으로 디자인되었습니다. 분할은 각 워크플로 인스턴스가 완료될 때 수행됩니다. 워크플로 인스턴스 추적에서 생성되는 레코드는 워크플로 인스턴스가 완료될 때까지 일반 추적 테이블에 추가됩니다. 이때 레코드는 파티션 테이블로 이동합니다. 분할을 사용할 수 있으면 추적 데이터에 사용할 새로운 테이블 집합이 주기적으로 만들어집니다. 완료된 워크플로 인스턴스의 추적된 데이터는 현재 실행 중인 응용 프로그램을 손상시키지 않고 이러한 새 파티션으로 이동합니다.

완료 시 분할 구성

기본적으로 SqlTrackingService에 대한 분할은 설정되어 있지 않습니다. SqlTrackingService로 관리되는 분할을 사용하려면 다음 코드 예제와 같이 PartitionOnCompletion 속성을 true로 설정합니다.

[C#]

string connectionString = "Initial Catalog=Tracking;Data Source=localhost;Integrated Security=SSPI;";
SqlTrackingService sqlTrackingService = new SqlTrackingService(connectionString);
sqlTrackingService.PartitionOnCompletion = true;

PartitionOnCompletion 속성을 사용하는 경우 새 파티션 테이블이 일정한 시간 간격마다 만들어지도록 파티션 테이블을 구성할 수 있습니다. 이 작업은 SqlTrackingService 스키마에서 TrackingPartitionInterval.Interval 열을 변경하여 수행됩니다. SetPartitionInterval이라는 저장 프로시저를 통해 이 작업을 수행하여 응용 프로그램 실행 중에 프로그래밍 방식으로 간격을 사용자 지정할 수 있습니다. 기본 파티션 간격은 매월을 의미하는 "m"입니다. 사용 가능한 값에는 매일을 의미하는 "d"와 매년을 의미하는 "y"도 있습니다. 이 옵션을 사용하는 경우 Windows Workflow Foundation에서는 지정한 시간 간격으로 새 파티션 집합(새 테이블 집합)을 만듭니다. vw_TrackingPartitionSetName 테이블에는 Name yyyy_m, CreatedDateTime, EndDateTimePartitionInterval과 같은 파티션 집합 이름에 대한 정보가 포함되어 있습니다. 워크플로 인스턴스가 완료되면 해당하는 추적된 데이터가 새로 만든 테이블 집합으로 이동합니다. 다음 코드에서는 PartitionOnCompletion 체계를 사용할 때 파티션 간격을 설정하는 방법을 보여 줍니다.

[C#]

internal static void SetPartitionInterval()
{
    // Valid values are 'd' (daily), 'm' (monthly), and 'y' (yearly).  
    // The default is 'm'.
    SqlCommand command = new SqlCommand("dbo.SetPartitionInterval");
    command.CommandType = CommandType.StoredProcedure;
    command.Connection = new SqlConnection(connectionString);
            
    SqlParameter intervalParameter = new SqlParameter("@Interval", SqlDbType.Char);
    intervalParameter.SqlValue = 'd';
    command.Parameters.Add(intervalParameter);
    try
    {
        command.Connection.Open();
        command.ExecuteNonQuery();
    }
    finally
    {
        if ((command != null) && (command.Connection != null) && 
            (ConnectionState.Closed != command.Connection.State))
        {
            command.Connection.Close();
        }
        command.Dispose();
    }
}

필요 시 분할

필요 시 분할은 주기적으로나 지속적으로 작동이 중단되고 작동 중단 중에 분할을 수행하려는 응용 프로그램용으로 디자인되었습니다. 이 체계를 사용하려면 SqlTracking_Logic.sql 스크립트를 실행할 때 만들어지는 PartitionCompletedWorkflowInstances 저장 프로시저를 실행하는 작업을 만듭니다. 이 저장 프로시저가 실행되면 완료된 워크플로 인스턴스에 의해 라이브 테이블에서 삽입된 추적 데이터가 파티션 테이블로 이동합니다.

추적 파티션 정보 및 테이블 표시

다음 코드에서는 SqlTrackingService 데이터베이스에서 만들어진 테이블을 비롯하여 파티션 정보를 추출하는 방법을 보여 줍니다.

[C#]

internal static void ShowTrackingPartitionInformation()
{
    // Show the contents of the TrackingPartitionName table.

    SqlCommand command = new SqlCommand("SELECT * FROM vw_TrackingPartitionSetName");
    SqlDataReader reader = null;
    command.CommandType = CommandType.Text;
    command.Connection = new SqlConnection(connectionString);

    try
    {
        command.Connection.Open();
        reader = command.ExecuteReader();
        if (reader.Read())
        {
            Console.WriteLine();
            Console.WriteLine("***************************");
            Console.WriteLine("Partition information: ");
            Console.WriteLine("PartitionId: {0}", reader[0]);
            Console.WriteLine("Name: {0}", reader[1]);
            Console.WriteLine("Created: {0}", reader[2]);
            Console.WriteLine("End: {0}", reader[3] is System.DBNull ? "NULL" : reader[3]);
            Console.WriteLine("Partition Interval: {0}", reader[4]);
            Console.WriteLine("***************************");
        }
        else
        {
            Console.WriteLine();
            Console.WriteLine("No partition information present.");
        }

    }
    finally
    {
        if ((reader != null) && (!reader.IsClosed))
            reader.Close();
        if ((command != null) && (command.Connection != null) && (ConnectionState.Closed != command.Connection.State))
        {
            command.Connection.Close();
        }
        command.Dispose();
    }
}

다음 코드에서는 SqlTrackingService 데이터베이스에 있는 파티션 테이블의 이름을 표시하는 방법을 보여 줍니다.

internal static void ShowPartitionTableInformation()
{
    SqlCommand command = new SqlCommand(
        "declare @trackingName varchar(255) select @trackingName = Name from vw_TrackingPartitionSetName " +
        "select name from sysobjects where name like '%' + @trackingName");
    
    Console.WriteLine();
    Console.WriteLine("***************************");
    Console.WriteLine("Partition tables: ");
    SqlDataReader reader = null;
    command.CommandType = CommandType.Text;
    command.Connection = new SqlConnection(connectionString);

    try
    {
        command.Connection.Open();
        reader = command.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine(reader[0]);
        }
    }
    finally
    {
        if ((reader != null) && (!reader.IsClosed))
            reader.Close();
        if ((command != null) && (command.Connection != null) && (ConnectionState.Closed != command.Connection.State))
        {
            command.Connection.Close();
        }
        command.Dispose();
    }
    Console.WriteLine("***************************");
}

참고 항목

참조

SqlTrackingService
PartitionOnCompletion

개념

SqlTrackingService 사용
SqlTrackingQuery로 SqlTrackingService 데이터 쿼리
Windows Workflow 추적 서비스

기타 리소스

SQL Data Maintenance Sample
Query Using SQLTrackingService Sample

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.