Files
Groupware/DBMigration/Services/MigrationService.cs

93 lines
3.1 KiB
C#

using Microsoft.Data.SqlClient;
using Microsoft.SqlServer.Management.Smo;
using DBMigration.Models;
namespace DBMigration.Services
{
public class MigrationService
{
private readonly DatabaseService _databaseService;
public MigrationService()
{
_databaseService = new DatabaseService();
}
public void MigrateTable(DatabaseObject table, ConnectionInfo source, ConnectionInfo target)
{
using (var sourceConn = new SqlConnection(source.GetConnectionString()))
using (var targetConn = new SqlConnection(target.GetConnectionString()))
{
sourceConn.Open();
targetConn.Open();
// 1. 테이블 생성 (인덱스 포함)
ExecuteScript(table.Definition, targetConn);
// 2. IDENTITY와 트리거 비활성화
DisableIdentityAndTriggers(table, targetConn);
// 3. 데이터 복사
CopyData(table, sourceConn, targetConn);
// 4. IDENTITY와 트리거 재활성화
EnableIdentityAndTriggers(table, targetConn);
// 5. 통계 업데이트
UpdateStatistics(table, targetConn);
}
}
private void ExecuteScript(string script, SqlConnection connection)
{
using (var cmd = new SqlCommand(script, connection))
{
cmd.ExecuteNonQuery();
}
}
private void DisableIdentityAndTriggers(DatabaseObject table, SqlConnection connection)
{
var disableScript = $@"
-- IDENTITY 비활성화
SET IDENTITY_INSERT {table.FullName} ON;
-- 트리거 비활성화
DISABLE TRIGGER ALL ON {table.FullName};";
ExecuteScript(disableScript, connection);
}
private void EnableIdentityAndTriggers(DatabaseObject table, SqlConnection connection)
{
var enableScript = $@"
-- IDENTITY 활성화
SET IDENTITY_INSERT {table.FullName} OFF;
-- 트리거 활성화
ENABLE TRIGGER ALL ON {table.FullName};";
ExecuteScript(enableScript, connection);
}
private void CopyData(DatabaseObject table, SqlConnection source, SqlConnection target)
{
using (var cmd = new SqlCommand($"SELECT * FROM {table.FullName}", source))
using (var reader = cmd.ExecuteReader())
{
using (var bulkCopy = new SqlBulkCopy(target))
{
bulkCopy.DestinationTableName = table.FullName;
bulkCopy.WriteToServer(reader);
}
}
}
private void UpdateStatistics(DatabaseObject table, SqlConnection connection)
{
var updateStatsScript = $"UPDATE STATISTICS {table.FullName} WITH FULLSCAN;";
ExecuteScript(updateStatsScript, connection);
}
}
}