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);
 | |
|         }
 | |
|     }
 | |
| }
 | 
