Explorar o código

*기능 추가
- AllInOne 기능 실행시 원본 DB의 사용자 권한도 복사하도록 수정
*기능 수정
- BackgroundWorker_Manager Exception 발생시 테이블 이름 같이 표시하도록 수정

chpark hai 3 meses
pai
achega
aefd0ca709

+ 1 - 1
DataManager/Class/BackgroundWorker_Manager.cs

@@ -89,7 +89,7 @@ namespace DataManager
             }
             catch (Exception ex)
             {
-                _SetStatusException(ex.Message);
+                _SetStatusException($"[{tableName}] >> {ex.Message}");
             }
         }
 

+ 38 - 0
DataManager/Class/Query_Manager.cs

@@ -19,6 +19,44 @@ SELECT name as table_name
             return query.Replace("@CURRENT_DB_NAME", currentDbName);
         }
 
+        public static string DropCurrentUsers()
+        {
+            string query = @"
+SELECT CONCAT('DROP USER [', name, ']') as query 
+  FROM sys.database_principals 
+ WHERE name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys')
+   AND type = 'S'
+";
+            return query;
+        }	  
+
+        public static string GetUserAndRoles(string sourceDbName)
+        {
+            string query = @"
+SELECT CONCAT('CREATE USER [', a.name, '] FOR LOGIN [', a.name, ']; ') as query
+  FROM (select c.name
+		  from [@SOURCE_DB_NAME].sys.database_role_members a
+			   INNER JOIN [@SOURCE_DB_NAME].sys.database_principals b ON a.role_principal_id = b.principal_id
+			   INNER JOIN [@SOURCE_DB_NAME].sys.database_principals c ON a.member_principal_id = c.principal_id
+		 where c.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys') -- 기본 사용자 제외
+	  group by c.name
+	   ) a
+	   LEFT OUTER JOIN sys.database_principals b on a.name = b.name
+ WHERE b.name is null
+
+ UNION ALL
+
+SELECT 'EXEC sp_addrolemember ''' + b.name + ''', ''' + c.name + '''; ' as query
+  FROM [@SOURCE_DB_NAME].sys.database_role_members a
+	   INNER JOIN [@SOURCE_DB_NAME].sys.database_principals b ON a.role_principal_id = b.principal_id
+	   INNER JOIN [@SOURCE_DB_NAME].sys.database_principals c ON a.member_principal_id = c.principal_id
+ WHERE c.type IN ('S', 'G', 'U') -- SQL 로그인, Windows 그룹, 데이터베이스 사용자만 포함
+   AND c.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys'); -- 기본 사용자 제외
+";
+            return query.Replace("@SOURCE_DB_NAME", sourceDbName);
+        }
+
+
         /// <summary>
         /// 현재 선택된 원본 DB의 테이블 목록을 가져온다
         /// </summary>

+ 23 - 0
DataManager/Class/Sql_Manager.cs

@@ -7,6 +7,8 @@ using System.Data;
 using System.Data.SqlClient;
 using DevExpress.XtraLayout.Customization;
 using System.Text.RegularExpressions;
+using DevExpress.Xpo.DB.Helpers;
+using DevExpress.Office.Utils;
 
 namespace DataManager
 {
@@ -83,6 +85,27 @@ namespace DataManager
             return ExecuteSql(DataType.DATA_TABLE, Query_Manager.GetDbList(currentDbName));
         }
 
+        public void DropCurrentUsers()
+        {
+            StringBuilder stringBuilder = new StringBuilder();
+            foreach (DataRow row in ExecuteSql(DataType.DATA_TABLE, Query_Manager.DropCurrentUsers()).Rows)
+            {
+                stringBuilder.Append(row["query"].ToString());
+            }
+            ExecuteSql(DataType.STRING, stringBuilder.ToString());
+        }
+
+        public void CopyUserAndRoles(string sourceDbName)
+        {
+            StringBuilder stringBuilder = new StringBuilder();
+            foreach (DataRow row in ExecuteSql(DataType.DATA_TABLE, Query_Manager.GetUserAndRoles(sourceDbName)).Rows)
+            {
+                stringBuilder.Append(row["query"].ToString());
+            }
+            ExecuteSql(DataType.STRING, stringBuilder.ToString());
+        }
+
+
         public DataTable GetTableList(string selectedDbName)
         {
             return ExecuteSql(DataType.DATA_TABLE, Query_Manager.GetTableList(selectedDbName));

+ 19 - 7
DataManager/Forms/AllInOneDashBoard.cs

@@ -397,7 +397,7 @@ namespace DataManager
                 };
 
                 DatabaseInfo BackupDbInfo = null;
-                DatabaseInfo tempDbDatabaseInfo = null;
+                DatabaseInfo tempDbInfo = null;
                 try
                 {
                     // 1. 기존 DB -> 백업 DB로 변경 (Database_Manager)
@@ -410,19 +410,23 @@ namespace DataManager
 
                     // 2. tempDbName으로 복원 (기존 DB에 데이터 insert 방지)
                     DisplayDatabaseStatus("백업 파일로 임시 DB 복원하는 중...");
-                    tempDbDatabaseInfo = RestoreDatabase(BackupDbInfo, databaseData.DatabaseName, databaseData.BackupFilePath);
+                    tempDbInfo = RestoreDatabase(BackupDbInfo, databaseData.DatabaseName, databaseData.BackupFilePath);
 
                     // 3. 데이터 복사 (CopyData)
                     DisplayDatabaseStatus("백업 DB에서 임시 DB로 데이터 복사하는 중...");
-                    Tuple<string, Sql_Manager> copyResult = CopyDataBackupToCurrent(tempDbDatabaseInfo.Current.DBName, BackupDbInfo);
+                    Tuple<string, Sql_Manager> copyResult = CopyDataBackupToCurrent(tempDbInfo.Current.DBName, BackupDbInfo);
                     if (copyResult.Item1 != string.Empty)
                     {
                         throw new Exception(copyResult.Item1);
                     }
 
-                    // 4. tempDbName -> dbName으로 변경 (Database_Manager)
+                    // 4. 권한 복사
+                    DisplayDatabaseStatus("사용자 권한 복사하는 중...");
+                    CopyUserAndRoles(BackupDbInfo.Current.DBName, copyResult.Item2);
+
+                    // 5. tempDbName -> dbName으로 변경 (Database_Manager)
                     DisplayDatabaseStatus("임시 DB를 기존 DB로 변경하는 중...");
-                    ModifyDatabase(tempDbDatabaseInfo, copyResult.Item2);
+                    ModifyDatabase(tempDbInfo, copyResult.Item2);
 
                     status = "Y";
                 }
@@ -440,13 +444,13 @@ namespace DataManager
                         sqlManager.SqlDisconnect();
                     }
 
-                    if (tempDbDatabaseInfo != null)
+                    if (tempDbInfo != null)
                     {
                         // 오류 발생한 임시 DB 삭제
                         Sql_Manager sqlManager = new Sql_Manager();
                         sqlManager.SqlConnect(Sql_Manager.CreateConnectionString(_DbThread.ServerName, "master", _DbThread.Id, _DbThread.Password));
                         DisplayDatabaseStatus("오류 발생 >> 임시 DB 삭제하는 중...");
-                        DropDatabase(tempDbDatabaseInfo, sqlManager);
+                        DropDatabase(tempDbInfo, sqlManager);
                         sqlManager.SqlDisconnect();
                     }
                     _DbThread.ErrorMessages.Add($"{databaseData.DatabaseName} >> {e.Message}");
@@ -508,6 +512,7 @@ namespace DataManager
         {
             Sql_Manager sqlManager = new Sql_Manager();
             sqlManager.SqlConnect(Sql_Manager.CreateConnectionString(_DbThread.ServerName, tempDbName, _DbThread.Id, _DbThread.Password));
+
             List<string> tableList = new List<string>();
             foreach (DataRow dataRow in sqlManager.GetTableList(backupDbInfo.Current.DBName).Rows)
             {
@@ -522,6 +527,13 @@ namespace DataManager
             return new Tuple<string, Sql_Manager>(copyData.ErrorMessage, sqlManager);
         }
 
+        private void CopyUserAndRoles(string backupDbName, Sql_Manager sqlManager)
+        {
+            sqlManager.DropCurrentUsers();
+            sqlManager.CopyUserAndRoles(backupDbName);
+        }
+
+
         private void ModifyDatabase(DatabaseInfo tempDbDatabaseInfo, Sql_Manager sqlManager)
         {
             Database_Manager databaseManager = new Database_Manager(tempDbDatabaseInfo, false, ref sqlManager);