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, EndDateTime 및 PartitionInterval과 같은 파티션 집합 이름에 대한 정보가 포함되어 있습니다. 워크플로 인스턴스가 완료되면 해당하는 추적된 데이터가 새로 만든 테이블 집합으로 이동합니다. 다음 코드에서는 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
Copyright © 2007 by Microsoft Corporation. All rights reserved.