Commit 1369dd36970987b2a4ee79f56091a0ffbb9cdb53
1 parent
8288c475
v1.29.2.0
- MoveDbToRemoteServer kiegészítése
Showing
2 changed files
with
181 additions
and
73 deletions
Show diff stats
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
@@ -135,7 +135,6 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -135,7 +135,6 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
135 | SQLDataBase sqld = p.Parameters as SQLDataBase; | 135 | SQLDataBase sqld = p.Parameters as SQLDataBase; |
136 | try | 136 | try |
137 | { | 137 | { |
138 | - | ||
139 | SQLDataBaseManagerCore.BackupSqlScripts(sqld,TS); | 138 | SQLDataBaseManagerCore.BackupSqlScripts(sqld,TS); |
140 | ColorConsole.WriteLine($"SQLDB code scripts created. Name:{sqld.Xml_Description}", ConsoleColor.Green); | 139 | ColorConsole.WriteLine($"SQLDB code scripts created. Name:{sqld.Xml_Description}", ConsoleColor.Green); |
141 | } | 140 | } |
@@ -633,16 +632,57 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -633,16 +632,57 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
633 | 632 | ||
634 | var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES); | 633 | var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES); |
635 | 634 | ||
636 | - selectionloop: | 635 | + (bool Exit, bool Yes) yesornoanswer; |
636 | + (bool Exit, bool Yes, SQLDataBase Dbfrom, SQLDataBase Dbto, string Selecteddbname, bool Emulation) movedbanswer; | ||
637 | + while (true) | ||
638 | + { | ||
639 | + var DateTimeNow = DateTime.Now; | ||
640 | + | ||
641 | + movedbanswer = YesOrNo_MoveDbToRemoteServer(config, selectedsqldbindexes); | ||
642 | + if (movedbanswer.Exit) break; | ||
643 | + if (movedbanswer.Yes) | ||
644 | + { | ||
645 | + var movesuccess = SQLDataBaseManagerCore.MoveDbToRemoteServer(movedbanswer.Dbfrom, movedbanswer.Dbto, movedbanswer.Selecteddbname, movedbanswer.Emulation); | ||
646 | + if (!movesuccess) continue; | ||
647 | + } | ||
648 | + | ||
649 | + var usernamelist = new string[] { "corplear\\lschwirg", "corplear\\gen_vrhalmadmin", $"corplear\\{Program.ThisComputer.ComputerName}$" }; | ||
650 | + | ||
651 | + yesornoanswer = YesOrNo_ServerLogin(movedbanswer.Dbfrom.SQLCS, usernamelist); | ||
652 | + if (yesornoanswer.Exit) return o; | ||
653 | + if (yesornoanswer.Yes) SQLDataBaseManagerCore.CreateServerLogins(movedbanswer.Emulation, movedbanswer.Dbfrom.SQLCS, usernamelist, loginrolelist,fullaccessrolelist); | ||
654 | + | ||
655 | + yesornoanswer = YesOrNo_ServerLogin(movedbanswer.Dbto.SQLCS, usernamelist); | ||
656 | + if (yesornoanswer.Exit) return o; | ||
657 | + if (yesornoanswer.Yes) SQLDataBaseManagerCore.CreateServerLogins(movedbanswer.Emulation, movedbanswer.Dbto.SQLCS, usernamelist, loginrolelist, fullaccessrolelist); | ||
658 | + | ||
659 | + yesornoanswer = YesOrNo_SetDbOffline(movedbanswer.Dbfrom.SQLCS, null); | ||
660 | + if (yesornoanswer.Exit) return o; | ||
661 | + if (yesornoanswer.Yes) SQLDataBaseManagerCore.SetDatabaseOffline(movedbanswer.Dbfrom.SQLCS); | ||
662 | + | ||
663 | + ColorConsole.WriteLine($"Moving DB to remote server completed. Required time: {(int)(DateTime.Now.Subtract(DateTimeNow).TotalSeconds)} seconds.", ConsoleColor.Green); | ||
664 | + } | ||
665 | + return o; | ||
666 | + } | ||
667 | + private static (bool,bool,SQLDataBase, SQLDataBase, string, bool) YesOrNo_MoveDbToRemoteServer(SQLDataBaseManagerXmlProcessor config,string selectedsqldbindexes) | ||
668 | + { | ||
669 | + (bool, bool, SQLDataBase, SQLDataBase, string, bool) returnvalueexit = (true, false, null, null, null, false); | ||
670 | + | ||
671 | + selectionloop: | ||
672 | + | ||
673 | + ColorConsole.WriteLine($"Do You want to move ANY database from local server to remote server?", ConsoleColor.Yellow); | ||
674 | + var yesorno = ColorConsole.ReadLine("Move?", ConsoleColor.Yellow, validitylist: new List<string> { "yes", "no" }, defaultvalue: "yes"); | ||
675 | + if (yesorno.ToUpper() == "EX") return returnvalueexit; | ||
676 | + | ||
637 | var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function. '{nameof(MoveDbToRemoteServer)}'! Format:FROMLOCALDB,TOREMOTEDB", silent: true, selectionmode: Menu.SelectionMode.Multi); | 677 | var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function. '{nameof(MoveDbToRemoteServer)}'! Format:FROMLOCALDB,TOREMOTEDB", silent: true, selectionmode: Menu.SelectionMode.Multi); |
638 | 678 | ||
639 | Menu.Selection sr = menufolders.Select(selectedsqldbindexes); | 679 | Menu.Selection sr = menufolders.Select(selectedsqldbindexes); |
640 | - if (sr.Result == Menu.SelectionResult.Exit) { return o; } | 680 | + if (sr.Result == Menu.SelectionResult.Exit) { return returnvalueexit; } |
641 | else if (sr.Result == Menu.SelectionResult.None) { goto selectionloop; } | 681 | else if (sr.Result == Menu.SelectionResult.None) { goto selectionloop; } |
642 | else if (sr.Result == Menu.SelectionResult.Error) { goto selectionloop; } | 682 | else if (sr.Result == Menu.SelectionResult.Error) { goto selectionloop; } |
643 | else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.FirstOrDefault() == null) { goto selectionloop; } | 683 | else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.FirstOrDefault() == null) { goto selectionloop; } |
644 | - else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.Count() != 2) | ||
645 | - { | 684 | + else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.Count() != 2) |
685 | + { | ||
646 | ColorConsole.WriteLine($"Select exactly 2 DB. Format:FROMLOCALDB,TOREMOTEDB", ConsoleColor.Red); | 686 | ColorConsole.WriteLine($"Select exactly 2 DB. Format:FROMLOCALDB,TOREMOTEDB", ConsoleColor.Red); |
647 | goto selectionloop; | 687 | goto selectionloop; |
648 | } | 688 | } |
@@ -652,7 +692,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -652,7 +692,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
652 | var spto = sr.SelectedParameterList.ElementAt(1); | 692 | var spto = sr.SelectedParameterList.ElementAt(1); |
653 | SQLDataBase dbfrom = spfrom.Parameters as SQLDataBase; | 693 | SQLDataBase dbfrom = spfrom.Parameters as SQLDataBase; |
654 | SQLDataBase dbto = spto.Parameters as SQLDataBase; | 694 | SQLDataBase dbto = spto.Parameters as SQLDataBase; |
655 | - if (!dbto.Xml_IsRemoteDB) | 695 | + if (!dbto.Xml_IsRemoteDB) |
656 | { | 696 | { |
657 | ColorConsole.WriteLine($"TOREMOTEDB '{dbto.SQLCS}' has to be remote!", ConsoleColor.Red); | 697 | ColorConsole.WriteLine($"TOREMOTEDB '{dbto.SQLCS}' has to be remote!", ConsoleColor.Red); |
658 | goto selectionloop; | 698 | goto selectionloop; |
@@ -662,64 +702,39 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -662,64 +702,39 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
662 | ColorConsole.WriteLine($"FROMLOCALDB '{dbfrom.SQLCS}' has to be local!", ConsoleColor.Red); | 702 | ColorConsole.WriteLine($"FROMLOCALDB '{dbfrom.SQLCS}' has to be local!", ConsoleColor.Red); |
663 | goto selectionloop; | 703 | goto selectionloop; |
664 | } | 704 | } |
705 | + if (yesorno.ToUpper() != "YES") return (false, false,dbfrom,dbto, null,false); | ||
706 | + | ||
665 | bool emulation = false; | 707 | bool emulation = false; |
666 | - | ||
667 | var selecteddbname = ColorConsole.ReadLine($"Enter the name of the restored DB. EMPTY={dbto.DBName}, EX=exit."); | 708 | var selecteddbname = ColorConsole.ReadLine($"Enter the name of the restored DB. EMPTY={dbto.DBName}, EX=exit."); |
668 | - if (selecteddbname.ToUpper() == "EX") return o; | ||
669 | - else if (string.IsNullOrWhiteSpace(selecteddbname)) selecteddbname=dbto.DBName; | 709 | + if (selecteddbname.ToUpper() == "EX") return returnvalueexit; |
710 | + else if (string.IsNullOrWhiteSpace(selecteddbname)) selecteddbname = dbto.DBName; | ||
670 | 711 | ||
671 | confirmloop:; | 712 | confirmloop:; |
672 | var selection = ColorConsole.ReadLine("Enter CONFIRM to start, EMU to emulate, EX to exit."); | 713 | var selection = ColorConsole.ReadLine("Enter CONFIRM to start, EMU to emulate, EX to exit."); |
673 | - if (selection.ToUpper() == "EX") return o; | 714 | + if (selection.ToUpper() == "EX") return returnvalueexit; |
674 | else if (selection.ToUpper() == "EMU") emulation = true; | 715 | else if (selection.ToUpper() == "EMU") emulation = true; |
675 | else if (selection.ToUpper() == "CONFIRM") { } | 716 | else if (selection.ToUpper() == "CONFIRM") { } |
676 | else goto confirmloop; | 717 | else goto confirmloop; |
677 | - | ||
678 | - var DateTimeNow = DateTime.Now; | ||
679 | - var usernameList = new string[] { "corplear\\lschwirg", "corplear\\gen_vrhalmadmin", $"corplear\\{Program.ThisComputer.ComputerName}$" }; | ||
680 | - foreach (var username in usernameList) | ||
681 | - { | ||
682 | - ColorConsole.WriteLine(username, ConsoleColor.Yellow, prefix: nameof(SQLDataBaseManagerCore.CreateUser) + ":"); | ||
683 | - try { if (!emulation) SQLDataBaseManagerCore.CreateLogin(dbfrom.SQLCS, username, null, "master", LoginType.WindowsUser, loginrolelist); } | ||
684 | - catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateLogin)+">>>: "+ex.MessageNested(), ConsoleColor.Red); } | ||
685 | - try { if (!emulation) SQLDataBaseManagerCore.CreateUser(dbfrom.SQLCS, username, string.Join(",", fullaccessrolelist), "w"); } | ||
686 | - catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateUser) + "\n" + ex.MessageNested(), ConsoleColor.Red); } | ||
687 | - } | ||
688 | - | ||
689 | - //backup dbfrom | ||
690 | - var backupfileFullname = SQLDataBaseManagerCore.CreateBackup(dbfrom, false, DateTimeNow,emulation); | ||
691 | - //move dbfrom to tranit area | ||
692 | - | ||
693 | - if (!emulation && !File.Exists(backupfileFullname)) { goto selectionloop; } | ||
694 | - | ||
695 | - string backupfileFilename = null; | ||
696 | - string tranzitfileFullname = null; | ||
697 | - try | ||
698 | - { | ||
699 | - backupfileFilename = Path.GetFileName(backupfileFullname); | ||
700 | - tranzitfileFullname = Path.Combine(dbto.Xml_TranzitDirectoryPath, backupfileFilename); | ||
701 | - ColorConsole.WriteLine($"Moving backup file {backupfileFullname} to tranzit location: {dbto.Xml_TranzitDirectoryPath}", ConsoleColor.Yellow); | ||
702 | - if (!emulation) | ||
703 | - { | ||
704 | - if (File.Exists(tranzitfileFullname)) { File.Delete(tranzitfileFullname); } | ||
705 | - File.Move(backupfileFullname, tranzitfileFullname); | ||
706 | - ColorConsole.WriteLine($"...completed...", ConsoleColor.Yellow); | ||
707 | - } | ||
708 | - } | ||
709 | - catch (Exception ex) | ||
710 | - { | ||
711 | - ColorConsole.WriteLine($"Moving file FAILED!", ConsoleColor.Red); | ||
712 | - ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); | ||
713 | - goto selectionloop; | ||
714 | - } | ||
715 | - if (!emulation && !File.Exists(tranzitfileFullname)) { goto selectionloop; } | ||
716 | - | ||
717 | - //restore backup to dbto | ||
718 | - tranzitfileFullname = Path.Combine(dbto.Xml_TranzitDirectoryPath, backupfileFilename); | ||
719 | - SQLDataBaseManagerCore.RestoreBackup(dbto, tranzitfileFullname, dbto.Xml_PhysicalFilesDirectoryPath, false, selecteddbname, emulation); | ||
720 | - | ||
721 | - ColorConsole.WriteLine($"Moving DB to remote server completed. Required time: {(int)(DateTime.Now.Subtract(DateTimeNow).TotalSeconds)} seconds.",ConsoleColor.Green); | ||
722 | - return o; | 718 | + return (false,true,dbfrom,dbto, selecteddbname,emulation); |
719 | + } | ||
720 | + private static (bool,bool) YesOrNo_SetDbOffline(string sqlcs, string dbname) | ||
721 | + { | ||
722 | + dbname = dbname ?? SQLDataBaseManagerCore.GetDBName(sqlcs); | ||
723 | + var servername = SQLDataBaseManagerCore.GetDataSource(sqlcs); | ||
724 | + ColorConsole.WriteLine($"Do You want to set database '{dbname}' OFFLINE on server '{servername}'?", ConsoleColor.Yellow); | ||
725 | + ColorConsole.WriteLine($" SQL connection string: {sqlcs}", ConsoleColor.Yellow); | ||
726 | + ColorConsole.WriteLine($" Server/database: {servername}/{dbname}", ConsoleColor.Yellow); | ||
727 | + var yesorno = ColorConsole.ReadLine("Set offline?", ConsoleColor.Yellow, validitylist: new List<string> { "yes", "no" }, defaultvalue: "yes"); | ||
728 | + return (yesorno.ToUpper() == "EX", yesorno.ToUpper() == "YES"); | ||
729 | + } | ||
730 | + private static (bool,bool) YesOrNo_ServerLogin(string sqlcs,string[] usernamelist) | ||
731 | + { | ||
732 | + ColorConsole.WriteLine($"Do You want to create the following mandatory server logins?", ConsoleColor.Yellow); | ||
733 | + ColorConsole.WriteLine($" SQL connection string: {sqlcs}", ConsoleColor.Yellow); | ||
734 | + ColorConsole.WriteLine($" Server: {SQLDataBaseManagerCore.GetDataSource(sqlcs)}", ConsoleColor.Yellow); | ||
735 | + ColorConsole.WriteLine($" Username list: " + string.Join(",", usernamelist), ConsoleColor.Yellow); | ||
736 | + var yesorno = ColorConsole.ReadLine("Create login?", ConsoleColor.Yellow, validitylist: new List<string> { "yes", "no" }, defaultvalue: "yes"); | ||
737 | + return (yesorno.ToUpper() == "EX", yesorno.ToUpper() == "YES"); | ||
723 | } | 738 | } |
724 | #endregion MoveDbToRemoteServer | 739 | #endregion MoveDbToRemoteServer |
725 | 740 | ||
@@ -1153,7 +1168,8 @@ GO | @@ -1153,7 +1168,8 @@ GO | ||
1153 | if (restoredbname.ToUpper() == "EX") { continue; } | 1168 | if (restoredbname.ToUpper() == "EX") { continue; } |
1154 | else if (string.IsNullOrWhiteSpace(restoredbname)) { restoredbname = sqld.DBName; } | 1169 | else if (string.IsNullOrWhiteSpace(restoredbname)) { restoredbname = sqld.DBName; } |
1155 | ColorConsole.WriteLine("Enter the path for the DB physical files.", ConsoleColor.Yellow); | 1170 | ColorConsole.WriteLine("Enter the path for the DB physical files.", ConsoleColor.Yellow); |
1156 | - ColorConsole.WriteLine(sqld.PhysicalFilesDirectoryPath, ConsoleColor.Yellow, prefix: $" Empty=current location of source DB: ", bracket: "[]"); | 1171 | + var PhysicalFilesDirectoryPathcolor = sqld.PhysicalFilesDirectoryPath.StartsWith("ERR") ? ConsoleColor.Red : ConsoleColor.Yellow; |
1172 | + ColorConsole.WriteLine(sqld.PhysicalFilesDirectoryPath, PhysicalFilesDirectoryPathcolor, prefix: $" Empty=current location of source DB: ", bracket: "[]"); | ||
1157 | ColorConsole.WriteLine(SQLDataBaseManagerCore.GetServerDefaultPhysicalDATFileLocation(sqld.SQLCS)??"???", ConsoleColor.Yellow,prefix: $" DEFAULT= sql server default location.",bracket:"[]"); | 1173 | ColorConsole.WriteLine(SQLDataBaseManagerCore.GetServerDefaultPhysicalDATFileLocation(sqld.SQLCS)??"???", ConsoleColor.Yellow,prefix: $" DEFAULT= sql server default location.",bracket:"[]"); |
1158 | var targetdirectory = ColorConsole.ReadLine($"Enter the target path.EX=exit.", ConsoleColor.Yellow, suffix: " --> "); | 1174 | var targetdirectory = ColorConsole.ReadLine($"Enter the target path.EX=exit.", ConsoleColor.Yellow, suffix: " --> "); |
1159 | if (targetdirectory.ToUpper() == "EX") { continue; } | 1175 | if (targetdirectory.ToUpper() == "EX") { continue; } |
@@ -1224,13 +1240,15 @@ GO | @@ -1224,13 +1240,15 @@ GO | ||
1224 | } | 1240 | } |
1225 | else if (lineix == 3) | 1241 | else if (lineix == 3) |
1226 | { | 1242 | { |
1227 | - ColorConsole.Write($"{st.PhysicalFilesDirectoryPath}", ConsoleColor.Yellow, prefix: "DB files physical location:", suffix: " "); | 1243 | + var PhysicalFilesDirectoryPathcolor = st.PhysicalFilesDirectoryPath.StartsWith("ERR") ? ConsoleColor.Red : ConsoleColor.Yellow; |
1244 | + ColorConsole.Write($"{st.PhysicalFilesDirectoryPath}", PhysicalFilesDirectoryPathcolor, prefix: "DB files physical location:", suffix: " "); | ||
1228 | ColorConsole.WriteLine(" "); | 1245 | ColorConsole.WriteLine(" "); |
1229 | return " "; | 1246 | return " "; |
1230 | } | 1247 | } |
1231 | else if (lineix == 4) | 1248 | else if (lineix == 4) |
1232 | { | 1249 | { |
1233 | - ColorConsole.Write(st.SizeString, ConsoleColor.Yellow, prefix: "DB size:", suffix: " "); | 1250 | + var SizeStringcolor = st.SizeString.StartsWith("ERR") ? ConsoleColor.Red : ConsoleColor.Yellow; |
1251 | + ColorConsole.Write(st.SizeString, SizeStringcolor, prefix: "DB size:", suffix: " "); | ||
1234 | ColorConsole.WriteLine(" "); | 1252 | ColorConsole.WriteLine(" "); |
1235 | return " "; | 1253 | return " "; |
1236 | } | 1254 | } |
@@ -1253,6 +1271,12 @@ GO | @@ -1253,6 +1271,12 @@ GO | ||
1253 | #region class SQLDataBaseManager | 1271 | #region class SQLDataBaseManager |
1254 | public static class SQLDataBaseManagerCore | 1272 | public static class SQLDataBaseManagerCore |
1255 | { | 1273 | { |
1274 | + /// <summary> | ||
1275 | + /// Egy adatbázis fizikai file-jainak mozgatása egy másik lokációba | ||
1276 | + /// </summary> | ||
1277 | + /// <param name="sqld"></param> | ||
1278 | + /// <param name="targetdirectory"></param> | ||
1279 | + /// <param name="restoredbname"></param> | ||
1256 | public static void RelocatePhysicalFiles(SQLDataBase sqld, string targetdirectory, string restoredbname) | 1280 | public static void RelocatePhysicalFiles(SQLDataBase sqld, string targetdirectory, string restoredbname) |
1257 | { | 1281 | { |
1258 | var dbbackupfilepath = CreateBackup(sqld, false,null); | 1282 | var dbbackupfilepath = CreateBackup(sqld, false,null); |
@@ -1260,6 +1284,52 @@ GO | @@ -1260,6 +1284,52 @@ GO | ||
1260 | RestoreBackup(sqld, dbbackupfilepath, targetdirectory, false, restoredbname); | 1284 | RestoreBackup(sqld, dbbackupfilepath, targetdirectory, false, restoredbname); |
1261 | if (File.Exists(dbbackupfilepath)) { File.Delete(dbbackupfilepath); } | 1285 | if (File.Exists(dbbackupfilepath)) { File.Delete(dbbackupfilepath); } |
1262 | } | 1286 | } |
1287 | + | ||
1288 | + /// <summary> | ||
1289 | + /// Egy adatbázis átmozgatása egy távoli szerverre | ||
1290 | + /// </summary> | ||
1291 | + /// <param name="dbfrom"></param> | ||
1292 | + /// <param name="dbto"></param> | ||
1293 | + /// <param name="selecteddbname"></param> | ||
1294 | + /// <param name="emulation"></param> | ||
1295 | + /// <returns></returns> | ||
1296 | + public static bool MoveDbToRemoteServer(SQLDataBase dbfrom, SQLDataBase dbto, string selecteddbname, bool emulation) | ||
1297 | + { | ||
1298 | + //backup dbfrom | ||
1299 | + var DateTimeNow = DateTime.Now; | ||
1300 | + var backupfileFullname = SQLDataBaseManagerCore.CreateBackup(dbfrom, false, DateTimeNow, emulation); | ||
1301 | + //move dbfrom to tranit area | ||
1302 | + | ||
1303 | + if (!emulation && !File.Exists(backupfileFullname)) { return false; } | ||
1304 | + | ||
1305 | + string backupfileFilename = null; | ||
1306 | + string tranzitfileFullname = null; | ||
1307 | + try | ||
1308 | + { | ||
1309 | + backupfileFilename = Path.GetFileName(backupfileFullname); | ||
1310 | + tranzitfileFullname = Path.Combine(dbto.Xml_TranzitDirectoryPath, backupfileFilename); | ||
1311 | + ColorConsole.WriteLine($"Moving backup file {backupfileFullname} to tranzit location: {dbto.Xml_TranzitDirectoryPath}", ConsoleColor.Yellow); | ||
1312 | + if (!emulation) | ||
1313 | + { | ||
1314 | + if (File.Exists(tranzitfileFullname)) { File.Delete(tranzitfileFullname); } | ||
1315 | + File.Move(backupfileFullname, tranzitfileFullname); | ||
1316 | + ColorConsole.WriteLine($"...completed...", ConsoleColor.Yellow); | ||
1317 | + } | ||
1318 | + } | ||
1319 | + catch (Exception ex) | ||
1320 | + { | ||
1321 | + ColorConsole.WriteLine($"Moving file FAILED!", ConsoleColor.Red); | ||
1322 | + ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); | ||
1323 | + return false; | ||
1324 | + } | ||
1325 | + if (!emulation && !File.Exists(tranzitfileFullname)) { return false; } | ||
1326 | + | ||
1327 | + //restore backup to dbto | ||
1328 | + tranzitfileFullname = Path.Combine(dbto.Xml_TranzitDirectoryPath, backupfileFilename); | ||
1329 | + SQLDataBaseManagerCore.RestoreBackup(dbto, tranzitfileFullname, dbto.Xml_PhysicalFilesDirectoryPath, false, selecteddbname, emulation); | ||
1330 | + return true; | ||
1331 | + } | ||
1332 | + | ||
1263 | /// <summary> | 1333 | /// <summary> |
1264 | /// Restores database backup (zipped or normal) | 1334 | /// Restores database backup (zipped or normal) |
1265 | /// </summary> | 1335 | /// </summary> |
@@ -1316,18 +1386,23 @@ GO | @@ -1316,18 +1386,23 @@ GO | ||
1316 | smoRestore.PercentCompleteNotification = 1; | 1386 | smoRestore.PercentCompleteNotification = 1; |
1317 | var backupdevice = new BackupDeviceItem(normalbackupfilepath, DeviceType.File); | 1387 | var backupdevice = new BackupDeviceItem(normalbackupfilepath, DeviceType.File); |
1318 | smoRestore.Devices.Add(backupdevice); | 1388 | smoRestore.Devices.Add(backupdevice); |
1319 | - smoRestore.Database = string.IsNullOrWhiteSpace(restoretodbname) | ||
1320 | - ? smoRestore.ReadBackupHeader(sqlserver).Rows[0]["DatabaseName"].ToString() | ||
1321 | - : restoretodbname; | ||
1322 | - | 1389 | + smoRestore.Database = restoretodbname; |
1390 | + if (string.IsNullOrWhiteSpace(smoRestore.Database)) | ||
1391 | + { | ||
1392 | + smoRestore.Database = smoRestore.ReadBackupHeader(sqlserver).Rows[0]["DatabaseName"].ToString(); | ||
1393 | + ColorConsole.WriteLine($"ReadBackupHeader completed. Database name in backup header:{smoRestore.Database}", ConsoleColor.Yellow); | ||
1394 | + } | ||
1323 | 1395 | ||
1324 | var dbfilelist = smoRestore.ReadFileList(sqlserver); | 1396 | var dbfilelist = smoRestore.ReadFileList(sqlserver); |
1397 | + ColorConsole.WriteLine($"ReadFileList completed.", ConsoleColor.Yellow); | ||
1325 | var smorestoreDATfile = new RelocateFile(); | 1398 | var smorestoreDATfile = new RelocateFile(); |
1326 | string targetdbphysicalfilesdirectorypathDAT = targetdbphysicalfilesdirectorypath; | 1399 | string targetdbphysicalfilesdirectorypathDAT = targetdbphysicalfilesdirectorypath; |
1327 | if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.DefaultFile; } | 1400 | if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.DefaultFile; } |
1328 | if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.MasterDBPath; } | 1401 | if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.MasterDBPath; } |
1329 | smorestoreDATfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathDAT, smoRestore.Database + "_Data.mdf"); | 1402 | smorestoreDATfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathDAT, smoRestore.Database + "_Data.mdf"); |
1330 | smorestoreDATfile.LogicalFileName = dbfilelist.Select("Type='D'")[0]["LogicalName"].ToString(); | 1403 | smorestoreDATfile.LogicalFileName = dbfilelist.Select("Type='D'")[0]["LogicalName"].ToString(); |
1404 | + ColorConsole.WriteLine($"DAT PhysicalFileName to relocate: {smorestoreDATfile.PhysicalFileName}", ConsoleColor.Yellow); | ||
1405 | + ColorConsole.WriteLine($"DAT LogicalFileName to relocate: {smorestoreDATfile.LogicalFileName}", ConsoleColor.Yellow); | ||
1331 | smoRestore.RelocateFiles.Add(smorestoreDATfile); | 1406 | smoRestore.RelocateFiles.Add(smorestoreDATfile); |
1332 | 1407 | ||
1333 | var smorestoreLOGfile = new RelocateFile(); | 1408 | var smorestoreLOGfile = new RelocateFile(); |
@@ -1336,6 +1411,8 @@ GO | @@ -1336,6 +1411,8 @@ GO | ||
1336 | if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathLOG)) { targetdbphysicalfilesdirectorypathLOG = sqlserver.MasterDBLogPath; } | 1411 | if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathLOG)) { targetdbphysicalfilesdirectorypathLOG = sqlserver.MasterDBLogPath; } |
1337 | smorestoreLOGfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathLOG, smoRestore.Database + "_Log.ldf"); | 1412 | smorestoreLOGfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathLOG, smoRestore.Database + "_Log.ldf"); |
1338 | smorestoreLOGfile.LogicalFileName = dbfilelist.Select("Type='L'")[0]["LogicalName"].ToString(); | 1413 | smorestoreLOGfile.LogicalFileName = dbfilelist.Select("Type='L'")[0]["LogicalName"].ToString(); |
1414 | + ColorConsole.WriteLine($"LOG PhysicalFileName to relocate: {smorestoreLOGfile.PhysicalFileName}", ConsoleColor.Yellow); | ||
1415 | + ColorConsole.WriteLine($"LOG LogicalFileName to relocate: {smorestoreLOGfile.LogicalFileName}", ConsoleColor.Yellow); | ||
1339 | smoRestore.RelocateFiles.Add(smorestoreLOGfile); | 1416 | smoRestore.RelocateFiles.Add(smorestoreLOGfile); |
1340 | 1417 | ||
1341 | GetExclusiveUse(smoRestore.Database, sqlserver, sc); | 1418 | GetExclusiveUse(smoRestore.Database, sqlserver, sc); |
@@ -1469,7 +1546,6 @@ GO | @@ -1469,7 +1546,6 @@ GO | ||
1469 | ColorConsole.Write($"Completed: {e.Percent}%. {e.Message}"); | 1546 | ColorConsole.Write($"Completed: {e.Percent}%. {e.Message}"); |
1470 | } | 1547 | } |
1471 | 1548 | ||
1472 | - #region private methods | ||
1473 | public static List<FileInfo> GetBackupFilePathList(SQLDataBase sqld) | 1549 | public static List<FileInfo> GetBackupFilePathList(SQLDataBase sqld) |
1474 | { | 1550 | { |
1475 | var filenamemask = Path.GetFileNameWithoutExtension(sqld.Xml_BackupFileNameMask); | 1551 | var filenamemask = Path.GetFileNameWithoutExtension(sqld.Xml_BackupFileNameMask); |
@@ -1619,6 +1695,17 @@ GO | @@ -1619,6 +1695,17 @@ GO | ||
1619 | } | 1695 | } |
1620 | finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | 1696 | finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } |
1621 | } | 1697 | } |
1698 | + public static void CreateServerLogins(bool emulation, string sqlcs, string[] usernamelist,string[] loginrolelist, string[] fullaccessrolelist) | ||
1699 | + { | ||
1700 | + foreach (var username in usernamelist) | ||
1701 | + { | ||
1702 | + ColorConsole.WriteLine(username, ConsoleColor.Yellow, prefix: nameof(SQLDataBaseManagerCore.CreateUser) + ":"); | ||
1703 | + try { if (!emulation) SQLDataBaseManagerCore.CreateLogin(sqlcs, username, null, "master", LoginType.WindowsUser, loginrolelist); } | ||
1704 | + catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateLogin) + ">>>: " + ex.MessageNested(), ConsoleColor.Red); } | ||
1705 | + try { if (!emulation) SQLDataBaseManagerCore.CreateUser(sqlcs, username, string.Join(",", fullaccessrolelist), "w"); } | ||
1706 | + catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateUser) + "\n" + ex.MessageNested(), ConsoleColor.Red); } | ||
1707 | + } | ||
1708 | + } | ||
1622 | 1709 | ||
1623 | public static void ConfigureWindowsUser(string cs, string sapassword, string databasename, string windowsfullusername,string windowsuserpassword,List<string> rolenamelist) | 1710 | public static void ConfigureWindowsUser(string cs, string sapassword, string databasename, string windowsfullusername,string windowsuserpassword,List<string> rolenamelist) |
1624 | { | 1711 | { |
@@ -1699,15 +1786,33 @@ GO | @@ -1699,15 +1786,33 @@ GO | ||
1699 | } | 1786 | } |
1700 | public static void GetExclusiveUse(string databasename,Server sqlserver,SqlConnection sc) | 1787 | public static void GetExclusiveUse(string databasename,Server sqlserver,SqlConnection sc) |
1701 | { | 1788 | { |
1702 | - try { sqlserver.KillAllProcesses(databasename); } | 1789 | + try |
1790 | + { | ||
1791 | + sqlserver.KillAllProcesses(databasename); | ||
1792 | + ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/KillAllProcesses completed.", ConsoleColor.Yellow); | ||
1793 | + } | ||
1703 | catch (Exception ex) { ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(Server.KillAllProcesses)}>>>:" + ex.MessageNested(), ConsoleColor.Red); } | 1794 | catch (Exception ex) { ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(Server.KillAllProcesses)}>>>:" + ex.MessageNested(), ConsoleColor.Red); } |
1704 | 1795 | ||
1705 | SqlCommand sqlcommand = null; | 1796 | SqlCommand sqlcommand = null; |
1706 | - try { sqlcommand = new SqlCommand($"ALTER DATABASE {databasename} SET Single_User WITH Rollback IMMEDIATE", sc); sqlcommand.ExecuteNonQuery(); } | 1797 | + try |
1798 | + { | ||
1799 | + var cmd = $"ALTER DATABASE {databasename} SET Single_User WITH Rollback IMMEDIATE"; | ||
1800 | + sqlcommand = new SqlCommand(cmd, sc); sqlcommand.ExecuteNonQuery(); | ||
1801 | + ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(SqlCommand.ExecuteNonQuery)}/\"{cmd}\" completed.", ConsoleColor.Yellow); | ||
1802 | + } | ||
1707 | catch (Exception ex) { ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(SqlCommand.ExecuteNonQuery)}>>>: " + ex.MessageNested(), ConsoleColor.Red); } | 1803 | catch (Exception ex) { ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(SqlCommand.ExecuteNonQuery)}>>>: " + ex.MessageNested(), ConsoleColor.Red); } |
1708 | finally { sqlcommand?.Dispose(); } | 1804 | finally { sqlcommand?.Dispose(); } |
1709 | } | 1805 | } |
1710 | 1806 | ||
1807 | + public static void SetDatabaseOffline(string sqlcs, string dbname=null) | ||
1808 | + { | ||
1809 | + dbname = dbname ?? SQLDataBaseManagerCore.GetDBName(sqlcs); | ||
1810 | + var sc = ServerConnectionPool.GetSqlConnection(sqlcs, "master"); | ||
1811 | + var cmd = $"ALTER DATABASE {dbname} SET OFFLINE WITH ROLLBACK IMMEDIATE"; | ||
1812 | + //var cmd = $"ALTER DATABASE {dbname ?? SQLDataBaseManagerCore.GetDBName(sqlcs)} SET ONLINE"; | ||
1813 | + var sqlcommand = new SqlCommand(cmd, sc); sqlcommand.ExecuteNonQuery(); | ||
1814 | + } | ||
1815 | + | ||
1711 | public static string GetServerDefaultPhysicalDATFileLocation(string cs) | 1816 | public static string GetServerDefaultPhysicalDATFileLocation(string cs) |
1712 | { | 1817 | { |
1713 | Server sqlserver = null; | 1818 | Server sqlserver = null; |
@@ -2186,7 +2291,6 @@ GO | @@ -2186,7 +2291,6 @@ GO | ||
2186 | } | 2291 | } |
2187 | } | 2292 | } |
2188 | #endregion BackupSqlData | 2293 | #endregion BackupSqlData |
2189 | - #endregion private methods | ||
2190 | } | 2294 | } |
2191 | #endregion class SQLDataBaseManager | 2295 | #endregion class SQLDataBaseManager |
2192 | 2296 | ||
@@ -2263,7 +2367,7 @@ GO | @@ -2263,7 +2367,7 @@ GO | ||
2263 | try | 2367 | try |
2264 | { | 2368 | { |
2265 | GetPhysicalFilesLocationAndSize(this.SQLCS, out this.SizeString, out this.PhysicalFilesDirectoryPath); | 2369 | GetPhysicalFilesLocationAndSize(this.SQLCS, out this.SizeString, out this.PhysicalFilesDirectoryPath); |
2266 | - this.Status = this.PhysicalFilesDirectoryPath=="ERR" ? SQLDBStatus.NoAccess : SQLDBStatus.OK; | 2370 | + this.Status = this.PhysicalFilesDirectoryPath.StartsWith("ERR") ? SQLDBStatus.NoAccess : SQLDBStatus.OK; |
2267 | this.DBName = SQLDataBaseManagerCore.GetDBName(this.SQLCS); | 2371 | this.DBName = SQLDataBaseManagerCore.GetDBName(this.SQLCS); |
2268 | this.DataSource = SQLDataBaseManagerCore.GetDataSource(this.SQLCS); | 2372 | this.DataSource = SQLDataBaseManagerCore.GetDataSource(this.SQLCS); |
2269 | } | 2373 | } |
@@ -2305,7 +2409,7 @@ GO | @@ -2305,7 +2409,7 @@ GO | ||
2305 | } | 2409 | } |
2306 | dbsizetext = dbsizetext ?? "N/A"; | 2410 | dbsizetext = dbsizetext ?? "N/A"; |
2307 | } | 2411 | } |
2308 | - catch { } | 2412 | + catch (Exception ex) {dbsizetext = $"ERROR! {nameof(GetPhysicalFilesLocationAndSize)} getting size." + ex.MessageNested() + $" sqlconnectionstring:{sqlconnectionstring}";} |
2309 | 2413 | ||
2310 | try | 2414 | try |
2311 | { | 2415 | { |
@@ -2322,10 +2426,14 @@ GO | @@ -2322,10 +2426,14 @@ GO | ||
2322 | var result = SQLDataBaseManagerCore.ExecuteSQLScript(sqlc, scripttext, commandtimeout, vars); | 2426 | var result = SQLDataBaseManagerCore.ExecuteSQLScript(sqlc, scripttext, commandtimeout, vars); |
2323 | if (result.ReturnValue != 0) { dbpathtext = Path.GetDirectoryName(result.ReturnMessage); } | 2427 | if (result.ReturnValue != 0) { dbpathtext = Path.GetDirectoryName(result.ReturnMessage); } |
2324 | } | 2428 | } |
2325 | - catch { } | 2429 | + catch (Exception ex) {dbpathtext =$"ERROR! {nameof(GetPhysicalFilesLocationAndSize)} getting location." + ex.MessageNested() + $" sqlconnectionstring:{sqlconnectionstring}";} |
2326 | sqlc.Close(); | 2430 | sqlc.Close(); |
2327 | } | 2431 | } |
2328 | - catch { } | 2432 | + catch (Exception ex) |
2433 | + { | ||
2434 | + dbpathtext = $"ERROR! {nameof(GetPhysicalFilesLocationAndSize)}." + ex.MessageNested() + $" sqlconnectionstring:{sqlconnectionstring}"; | ||
2435 | + dbsizetext = null; | ||
2436 | + } | ||
2329 | dbsizetext = dbsizetext ?? "ERR"; | 2437 | dbsizetext = dbsizetext ?? "ERR"; |
2330 | dbpathtext = dbpathtext ?? "ERR"; | 2438 | dbpathtext = dbpathtext ?? "ERR"; |
2331 | } | 2439 | } |
Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | ||
32 | // You can specify all the values or you can default the Build and Revision Numbers | 32 | // You can specify all the values or you can default the Build and Revision Numbers |
33 | // by using the '*' as shown below: | 33 | // by using the '*' as shown below: |
34 | // [assembly: AssemblyVersion("1.0.*")] | 34 | // [assembly: AssemblyVersion("1.0.*")] |
35 | -[assembly: AssemblyVersion("1.29.1.0")] | ||
36 | -[assembly: AssemblyFileVersion("1.29.1.0")] | 35 | +[assembly: AssemblyVersion("1.29.2.0")] |
36 | +[assembly: AssemblyFileVersion("1.29.2.0")] |