entity 오류로인해 제거해야해서 . 제거전 백업
This commit is contained in:
92
DBMigration/Services/MigrationService.cs
Normal file
92
DBMigration/Services/MigrationService.cs
Normal file
@@ -0,0 +1,92 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user