93 lines
3.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|