Commit 31cca8095fdfee6fcccba81b77f75a74fc5b7d3e

Authored by Schwirg László
1 parent 34b4dbe8

v1.31.8.0

- Move DB to remote server letisztázása
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
@@ -32,6 +32,7 @@ using System.Security.Cryptography; @@ -32,6 +32,7 @@ using System.Security.Cryptography;
32 using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder; 32 using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder;
33 using System.Windows.Controls; 33 using System.Windows.Controls;
34 using Menu = Vrh.Log4Pro.MaintenanceConsole.MenuNS.Menu; 34 using Menu = Vrh.Log4Pro.MaintenanceConsole.MenuNS.Menu;
  35 +using static Vrh.Log4Pro.MaintenanceConsole.MenuNS.Menu;
35 36
36 namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS 37 namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
37 { 38 {
@@ -69,25 +70,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -69,25 +70,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
69 menufunctions.ExecuteMenu(functionkey); 70 menufunctions.ExecuteMenu(functionkey);
70 return o2; 71 return o2;
71 } 72 }
72 - public static void Execute(string key, bool enabledbbackup, bool enablescriptbackup, bool enabletabledatabackup, string targetfolder=null,DateTime? timestamp = null)  
73 - {  
74 - var packagets = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss");  
75 - var config = new SQLDataBaseManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU");  
76 - var origsqld = config.GetDefinitionList().FirstOrDefault(x => x.Xml_Key == key);  
77 - if (origsqld != null)  
78 - {  
79 - var sqld = new SQLDataBase(origsqld);  
80 - var dbname = SQLDataBaseManagerCore.GetDBName(sqld.SQLCS);  
81 - ColorConsole.WriteLine($"Database backup process started. DB key:'{key}', name:'{dbname}'...", ConsoleColor.Yellow);  
82 - if (!string.IsNullOrWhiteSpace(targetfolder)) { sqld.Xml_BackupTargetDirectoryPath = targetfolder; }  
83 - if (enabledbbackup) { SQLDataBaseManagerCore.CreateBackup(sqld,null, timestamp); }  
84 - if (enablescriptbackup) { SQLDataBaseManagerCore.BackupSqlScripts(sqld, timestamp); }  
85 - if (enabletabledatabackup) { SQLDataBaseManagerCore.BackupSqlData(sqld, timestamp); }  
86 - ColorConsole.WriteLine($"Database backup process finished!", ConsoleColor.DarkGreen);  
87 - }  
88 - else { ColorConsole.WriteLine($"Database backup process error. DB key incorrect:'{key}'...", ConsoleColor.Red); }  
89 - }  
90 - #endregion Execute 73 + #endregion Execute
91 74
92 #region First level Executors with UI 75 #region First level Executors with UI
93 private static object CreateDataScripts(object parameter, object o) 76 private static object CreateDataScripts(object parameter, object o)
@@ -180,12 +163,6 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -180,12 +163,6 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
180 } 163 }
181 return o; 164 return o;
182 } 165 }
183 - private static bool NoDBNameSpecified(SQLDataBase ssqldb)  
184 - {  
185 - const string FUNNOTAVAILTXT = "Function is not available for server connection strings wit no DB name specified!";  
186 - if (string.IsNullOrWhiteSpace(SQLDataBaseManagerCore.GetDBName(ssqldb.SQLCS))) { ColorConsole.WriteLine(FUNNOTAVAILTXT, ConsoleColor.Red); ssqldb.DBName = "master"; return true; }  
187 - return false;  
188 - }  
189 private static object RestoreDataBase(object parameter, object o) 166 private static object RestoreDataBase(object parameter, object o)
190 { 167 {
191 var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); 168 var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>();
@@ -482,9 +459,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -482,9 +459,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
482 459
483 #region CreateDBUser 460 #region CreateDBUser
484 private static string[] selectablerolelist = new string[] { "FULLACCESS", "DATAREADER", "db_accessadmin", "db_backupoperator", "db_datareader", "db_datawriter", "db_ddladmin", "db_denydatareader", "db_denydatawriter", "db_owner", "db_securityadmin", }; 461 private static string[] selectablerolelist = new string[] { "FULLACCESS", "DATAREADER", "db_accessadmin", "db_backupoperator", "db_datareader", "db_datawriter", "db_ddladmin", "db_denydatareader", "db_denydatawriter", "db_owner", "db_securityadmin", };
485 - private static string[] fullaccessrolelist = new string[] { "db_accessadmin", "db_backupoperator", "db_datareader", "db_datawriter", "db_ddladmin", "db_owner", "db_securityadmin", }; 462 + private static string[] fullaccessdbloginrolelist = new string[] { "db_accessadmin", "db_backupoperator", "db_datareader", "db_datawriter", "db_ddladmin", "db_owner", "db_securityadmin", };
486 private static string[] datareaderrolelist = new string[] { "db_datareader", }; 463 private static string[] datareaderrolelist = new string[] { "db_datareader", };
487 - private static string[] loginrolelist = new string[] { "dbcreator", "securityadmin", }; 464 + private static string[] serverloginrolelist = new string[] { "dbcreator", "securityadmin", };
488 private const string COMMA = ","; 465 private const string COMMA = ",";
489 private static object CreateDBUser(object parameter, object o) 466 private static object CreateDBUser(object parameter, object o)
490 { 467 {
@@ -602,7 +579,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -602,7 +579,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
602 if (selectedrolelistnum > 1 && specialselectionactive) { ColorConsole.WriteLine($"ERROR! FULLACCESS or DATAREADER has to be selected alone!", ConsoleColor.Red); return null; } 579 if (selectedrolelistnum > 1 && specialselectionactive) { ColorConsole.WriteLine($"ERROR! FULLACCESS or DATAREADER has to be selected alone!", ConsoleColor.Red); return null; }
603 if (badrolenames.Count > 0) { ColorConsole.WriteLine($"ERROR! {string.Join(COMMA, badrolenames)} are not available!", ConsoleColor.Red); return null; } 580 if (badrolenames.Count > 0) { ColorConsole.WriteLine($"ERROR! {string.Join(COMMA, badrolenames)} are not available!", ConsoleColor.Red); return null; }
604 var effectiverolelist = 581 var effectiverolelist =
605 - enablefullaccess ? fullaccessrolelist 582 + enablefullaccess ? fullaccessdbloginrolelist
606 : enabledatareader ? datareaderrolelist 583 : enabledatareader ? datareaderrolelist
607 : selectedrolelist; 584 : selectedrolelist;
608 return string.Join(",", effectiverolelist); 585 return string.Join(",", effectiverolelist);
@@ -649,116 +626,128 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -649,116 +626,128 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
649 626
650 var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES); 627 var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES);
651 628
652 - (bool Exit, bool Yes) yesornoanswer;  
653 - (bool Exit, bool Yes, SQLDataBase Dbfrom, SQLDataBase Dbto, string Selecteddbname, bool Emulation) movedbanswer;  
654 - while (true)  
655 - { 629 + while (true)
  630 + {
656 var DateTimeNow = DateTime.Now; 631 var DateTimeNow = DateTime.Now;
  632 + SQLDataBase dbfrom = null;
  633 + SQLDataBase dbto = null;
657 634
658 - movedbanswer = YesOrNo_MoveDbToRemoteServer(config, selectedsqldbindexes);  
659 - if (NoDBNameSpecified(movedbanswer.Dbfrom)) { continue; }  
660 - if (NoDBNameSpecified(movedbanswer.Dbto)) { continue; }  
661 - if (movedbanswer.Exit) break;  
662 - if (movedbanswer.Yes) 635 + movedatabaseloop:
  636 + (Menu.SelectionResult selectionresult, bool yes) yesornoanswer = YesOrNo(new List<string>() { $"Do You want to move ANY database from local server to remote server?" });
  637 + if (yesornoanswer.selectionresult == Menu.SelectionResult.Exit) return o;
  638 + if (yesornoanswer.selectionresult == Menu.SelectionResult.Ok && yesornoanswer.yes)
663 { 639 {
664 - var movesuccess = SQLDataBaseManagerCore.MoveDbToRemoteServer(movedbanswer.Dbfrom, movedbanswer.Dbto, movedbanswer.Selecteddbname, movedbanswer.Emulation);  
665 - if (!movesuccess) continue;  
666 - }  
667 -  
668 - var usernamelist = new string[] { "corplear\\lschwirg", "corplear\\gen_vrhalmadmin", $"corplear\\{Program.ThisComputer.ComputerName}$" }; 640 + var dbselection = SelectToDbAndFromDb(config, selectedsqldbindexes, $"Select the SQL database(s) to move the first to the second.!");
  641 + if (dbselection.selection == Menu.SelectionResult.Exit) { return o; }
  642 + if (dbselection.selection != Menu.SelectionResult.Ok) { goto movedatabaseloop; }
  643 + dbfrom = dbselection.dbfrom;
  644 + dbto = dbselection.dbto;
  645 + if (NoDBNameSpecified(dbfrom) || NoDBNameSpecified(dbto)) { continue; }
  646 +
  647 + var todbname = ColorConsole.ReadLine($"Enter the name of the target DB. EMPTY={dbto.DBName}, EX=exit.");
  648 + if (todbname.ToUpper() == "EX") { return o; }
  649 + else if (string.IsNullOrWhiteSpace(todbname)) todbname = dbto.DBName;
  650 +
  651 + confirmloop:;
  652 + var confirmtext = ColorConsole.ReadLine("Enter CONFIRM to start, EX to exit, SKIP to skip.");
  653 + if (confirmtext.ToUpper() == "EX") { return o; }
  654 + else if (confirmtext.ToUpper() == "CONFIRM")
  655 + {
  656 + var movesuccess = SQLDataBaseManagerCore.MoveDbToRemoteServer(dbfrom, dbto, todbname, false);
  657 + if (!movesuccess) continue;
  658 + }
  659 + else if (confirmtext.ToUpper() != "SKIP") { goto confirmloop; };
  660 + }
669 661
670 - yesornoanswer = YesOrNo_ServerLogin(movedbanswer.Dbfrom.SQLCS, usernamelist);  
671 - if (yesornoanswer.Exit) return o;  
672 - if (yesornoanswer.Yes) SQLDataBaseManagerCore.CreateServerLogins(movedbanswer.Emulation, movedbanswer.Dbfrom.SQLCS, usernamelist, loginrolelist,fullaccessrolelist); 662 + serverloginloop:
  663 + yesornoanswer = YesOrNo(new List<string>() { $"Do You want to create server and DB logins for local and/or remote server/database?", });
  664 + if (yesornoanswer.selectionresult == Menu.SelectionResult.Exit) return o;
  665 + if (yesornoanswer.selectionresult == Menu.SelectionResult.Ok && yesornoanswer.yes)
  666 + {
  667 + if (dbfrom == null || dbto == null)
  668 + {
  669 + var dbselection = SelectToDbAndFromDb(config, selectedsqldbindexes, $"Select the SQL database(s) to add server and DB logins!");
  670 + if (dbselection.selection == Menu.SelectionResult.Exit) { return o; }
  671 + if (dbselection.selection != Menu.SelectionResult.Ok) { goto serverloginloop; }
  672 + dbfrom = dbselection.dbfrom;
  673 + dbto = dbselection.dbto;
  674 + }
  675 + var usernamelist = new string[] { "corplear\\lschwirg", "corplear\\gen_vrhalmadmin", $"corplear\\{Program.ThisComputer.ComputerName}$" };
  676 +
  677 + string l1 = $"Do You want to create the following mandatory server and DB logins for SOURCE server and DB?";
  678 + string l2 = $" SQL connection string: {dbfrom.SQLCS}";
  679 + string l3 = $" Username list: " + string.Join(",", usernamelist);
  680 + yesornoanswer = YesOrNo(new List<string>() { l1, l2, l3, });
  681 + if (yesornoanswer.selectionresult== Menu.SelectionResult.Exit) return o;
  682 + if (yesornoanswer.selectionresult == Menu.SelectionResult.Ok && yesornoanswer.yes)
  683 + {
  684 + SQLDataBaseManagerCore.CreateServerAndDBLogins(false, dbfrom.SQLCS, usernamelist, serverloginrolelist, fullaccessdbloginrolelist);
  685 + }
673 686
674 - yesornoanswer = YesOrNo_ServerLogin(movedbanswer.Dbto.SQLCS, usernamelist);  
675 - if (yesornoanswer.Exit) return o;  
676 - if (yesornoanswer.Yes) SQLDataBaseManagerCore.CreateServerLogins(movedbanswer.Emulation, movedbanswer.Dbto.SQLCS, usernamelist, loginrolelist, fullaccessrolelist); 687 + string l13 = $"Do You want to create the following mandatory server and DB logins for TARGET server and DB?";
  688 + string l23 = $" SQL connection string: {dbto.SQLCS}";
  689 + string l33 = $" Username list: " + string.Join(",", usernamelist);
  690 + yesornoanswer = YesOrNo(new List<string>() { l13,l23,l33,});
  691 + if (yesornoanswer.selectionresult == Menu.SelectionResult.Exit) return o;
  692 + if (yesornoanswer.selectionresult == Menu.SelectionResult.Ok && yesornoanswer.yes)
  693 + {
  694 + SQLDataBaseManagerCore.CreateServerAndDBLogins(false, dbto.SQLCS, usernamelist, serverloginrolelist, fullaccessdbloginrolelist);
  695 + }
  696 + }
677 697
678 - yesornoanswer = YesOrNo_SetDbOffline(movedbanswer.Dbfrom.SQLCS, null);  
679 - if (yesornoanswer.Exit) return o;  
680 - if (yesornoanswer.Yes) SQLDataBaseManagerCore.SetDatabaseOffline(movedbanswer.Dbfrom.SQLCS); 698 + yesornoanswer = YesOrNo(new List<string>() { $"Do You want to set database '{SQLDataBaseManagerCore.GetDBName(dbfrom.SQLCS)}' OFFLINE on server '{SQLDataBaseManagerCore.GetDataSource(dbfrom.SQLCS)}'?", });
  699 + if (yesornoanswer.selectionresult == Menu.SelectionResult.Exit) return o;
  700 + if (yesornoanswer.selectionresult == Menu.SelectionResult.Ok && yesornoanswer.yes)
  701 + {
  702 + SQLDataBaseManagerCore.SetDatabaseOffline(dbfrom.SQLCS);
  703 + }
681 704
682 - ColorConsole.WriteLine($"Moving DB to remote server completed. Required time: {(int)(DateTime.Now.Subtract(DateTimeNow).TotalSeconds)} seconds.", ConsoleColor.Green); 705 + ColorConsole.WriteLine($"Process completed. Required time: {(int)(DateTime.Now.Subtract(DateTimeNow).TotalSeconds)} seconds.", ConsoleColor.Green);
683 } 706 }
684 - return o;  
685 } 707 }
686 - private static (bool,bool,SQLDataBase, SQLDataBase, string, bool) YesOrNo_MoveDbToRemoteServer(SQLDataBaseManagerXmlProcessor config,string selectedsqldbindexes) 708 + private static (Menu.SelectionResult selection,SQLDataBase dbfrom,SQLDataBase dbto) SelectToDbAndFromDb(SQLDataBaseManagerXmlProcessor config, string selectedsqldbindexes, string databaseselectionheadertext)
  709 + {
  710 + var menufolders = DisplaySQLDataBaseMenu(config, $"{databaseselectionheadertext} Format:FROMLOCALDB,TOREMOTEDB", silent: true, selectionmode: Menu.SelectionMode.Multi);
  711 + Menu.Selection sr = menufolders.Select(selectedsqldbindexes);
  712 + if (sr.Result == Menu.SelectionResult.Exit) { return (Menu.SelectionResult.Exit, null,null); }
  713 + else if (sr.Result == Menu.SelectionResult.None) { return (Menu.SelectionResult.None, null,null); }
  714 + else if (sr.Result == Menu.SelectionResult.Error) { return (Menu.SelectionResult.Error, null, null); }
  715 + else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.FirstOrDefault() == null) { return (Menu.SelectionResult.Error, null, null); }
  716 + else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.Count() != 2)
  717 + {
  718 + ColorConsole.WriteLine($"Select exactly 2 DB. Format:FROMLOCALDB,TOREMOTEDB", ConsoleColor.Red);
  719 + return (Menu.SelectionResult.Error, null, null);
  720 + }
  721 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  722 + else { }
  723 + var spfrom = sr.SelectedParameterList.First();
  724 + var spto = sr.SelectedParameterList.ElementAt(1);
  725 + SQLDataBase dbfrom = spfrom.Parameters as SQLDataBase;
  726 + SQLDataBase dbto = spto.Parameters as SQLDataBase;
  727 + if (!dbto.Xml_IsRemoteDB)
  728 + {
  729 + ColorConsole.WriteLine($"TOREMOTEDB '{dbto.SQLCS}' has to be remote!", ConsoleColor.Red);
  730 + return (Menu.SelectionResult.Error, null, null);
  731 + }
  732 + if (dbfrom.Xml_IsRemoteDB)
  733 + {
  734 + ColorConsole.WriteLine($"FROMLOCALDB '{dbfrom.SQLCS}' has to be local!", ConsoleColor.Red);
  735 + return (Menu.SelectionResult.Error, null, null);
  736 + }
  737 + return (Menu.SelectionResult.Ok, dbfrom,dbto);
  738 + }
  739 + private static (Menu.SelectionResult selectionresult, bool yes) YesOrNo(List<string> questiontextLines)
687 { 740 {
688 - (bool, bool, SQLDataBase, SQLDataBase, string, bool) returnvalueexit = (true, false, null, null, null, false);  
689 -  
690 - selectionloop:  
691 -  
692 - ColorConsole.WriteLine($"Do You want to move ANY database from local server to remote server?", ConsoleColor.Yellow);  
693 - var yesorno = ColorConsole.ReadLine("Move?", ConsoleColor.Yellow, validitylist: new List<string> { "yes", "no" }, defaultvalue: "yes");  
694 - if (yesorno.ToUpper() == "EX") return returnvalueexit;  
695 -  
696 - var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function. '{nameof(MoveDbToRemoteServer)}'! Format:FROMLOCALDB,TOREMOTEDB", silent: true, selectionmode: Menu.SelectionMode.Multi);  
697 -  
698 - Menu.Selection sr = menufolders.Select(selectedsqldbindexes);  
699 - if (sr.Result == Menu.SelectionResult.Exit) { return returnvalueexit; }  
700 - else if (sr.Result == Menu.SelectionResult.None) { goto selectionloop; }  
701 - else if (sr.Result == Menu.SelectionResult.Error) { goto selectionloop; }  
702 - else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.FirstOrDefault() == null) { goto selectionloop; }  
703 - else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.Count() != 2)  
704 - {  
705 - ColorConsole.WriteLine($"Select exactly 2 DB. Format:FROMLOCALDB,TOREMOTEDB", ConsoleColor.Red);  
706 - goto selectionloop;  
707 - }  
708 - else if (sr.Result == Menu.SelectionResult.Ok) { }  
709 - else { }  
710 - var spfrom = sr.SelectedParameterList.First();  
711 - var spto = sr.SelectedParameterList.ElementAt(1);  
712 - SQLDataBase dbfrom = spfrom.Parameters as SQLDataBase;  
713 - SQLDataBase dbto = spto.Parameters as SQLDataBase;  
714 - if (!dbto.Xml_IsRemoteDB)  
715 - {  
716 - ColorConsole.WriteLine($"TOREMOTEDB '{dbto.SQLCS}' has to be remote!", ConsoleColor.Red);  
717 - goto selectionloop;  
718 - }  
719 - if (dbfrom.Xml_IsRemoteDB)  
720 - {  
721 - ColorConsole.WriteLine($"FROMLOCALDB '{dbfrom.SQLCS}' has to be local!", ConsoleColor.Red);  
722 - goto selectionloop;  
723 - }  
724 - if (yesorno.ToUpper() != "YES") return (false, false,dbfrom,dbto, null,false);  
725 -  
726 - bool emulation = false;  
727 - var selecteddbname = ColorConsole.ReadLine($"Enter the name of the restored DB. EMPTY={dbto.DBName}, EX=exit.");  
728 - if (selecteddbname.ToUpper() == "EX") return returnvalueexit;  
729 - else if (string.IsNullOrWhiteSpace(selecteddbname)) selecteddbname = dbto.DBName; 741 + if (questiontextLines!=null) foreach(string l in questiontextLines) { ColorConsole.WriteLine(l, ConsoleColor.Yellow); }
  742 + var yesorno = ColorConsole.ReadLine("Do action?", ConsoleColor.Yellow, validitylist: new List<string> { "yes", "no" }, defaultvalue: "yes");
  743 + if (yesorno.ToUpper() == "EX") return (Menu.SelectionResult.Exit, false);
  744 + else if (yesorno.ToUpper() == "yes") return (Menu.SelectionResult.Ok, true);
  745 + else return (Menu.SelectionResult.Ok, false);
  746 + }
  747 + #endregion MoveDbToRemoteServer
730 748
731 - confirmloop:;  
732 - var selection = ColorConsole.ReadLine("Enter CONFIRM to start, EMU to emulate, EX to exit.");  
733 - if (selection.ToUpper() == "EX") return returnvalueexit;  
734 - else if (selection.ToUpper() == "EMU") emulation = true;  
735 - else if (selection.ToUpper() == "CONFIRM") { }  
736 - else goto confirmloop;  
737 - return (false,true,dbfrom,dbto, selecteddbname,emulation);  
738 - }  
739 - private static (bool,bool) YesOrNo_SetDbOffline(string sqlcs, string dbname)  
740 - {  
741 - dbname = dbname ?? SQLDataBaseManagerCore.GetDBName(sqlcs);  
742 - var servername = SQLDataBaseManagerCore.GetDataSource(sqlcs);  
743 - ColorConsole.WriteLine($"Do You want to set database '{dbname}' OFFLINE on server '{servername}'?", ConsoleColor.Yellow);  
744 - ColorConsole.WriteLine($" SQL connection string: {sqlcs}", ConsoleColor.Yellow);  
745 - ColorConsole.WriteLine($" Server/database: {servername}/{dbname}", ConsoleColor.Yellow);  
746 - var yesorno = ColorConsole.ReadLine("Set offline?", ConsoleColor.Yellow, validitylist: new List<string> { "yes", "no" }, defaultvalue: "yes");  
747 - return (yesorno.ToUpper() == "EX", yesorno.ToUpper() == "YES");  
748 - }  
749 - private static (bool,bool) YesOrNo_ServerLogin(string sqlcs,string[] usernamelist)  
750 - {  
751 - ColorConsole.WriteLine($"Do You want to create the following mandatory server logins?", ConsoleColor.Yellow);  
752 - ColorConsole.WriteLine($" SQL connection string: {sqlcs}", ConsoleColor.Yellow);  
753 - ColorConsole.WriteLine($" Server: {SQLDataBaseManagerCore.GetDataSource(sqlcs)}", ConsoleColor.Yellow);  
754 - ColorConsole.WriteLine($" Username list: " + string.Join(",", usernamelist), ConsoleColor.Yellow);  
755 - var yesorno = ColorConsole.ReadLine("Create login?", ConsoleColor.Yellow, validitylist: new List<string> { "yes", "no" }, defaultvalue: "yes");  
756 - return (yesorno.ToUpper() == "EX", yesorno.ToUpper() == "YES");  
757 - }  
758 - #endregion MoveDbToRemoteServer  
759 -  
760 - #region ManageLastUpdatedTrigger  
761 - private static object ManageLastUpdatedTrigger(object parameter, object o) { return _ManageLastUpdatedTrigger(parameter, o, null); } 749 + #region ManageLastUpdatedTrigger
  750 + private static object ManageLastUpdatedTrigger(object parameter, object o) { return _ManageLastUpdatedTrigger(parameter, o, null); }
762 #region script texts for _RemoveAndCreateLastUpdatedTrigger 751 #region script texts for _RemoveAndCreateLastUpdatedTrigger
763 const string Header_Script = 752 const string Header_Script =
764 @"USE [{DBNAME}] 753 @"USE [{DBNAME}]
@@ -977,6 +966,7 @@ GO @@ -977,6 +966,7 @@ GO
977 } 966 }
978 #endregion ManageLastUpdatedTrigger 967 #endregion ManageLastUpdatedTrigger
979 968
  969 + #region ExecuteScript
980 private static object ExecuteScript(object parameter, object o) 970 private static object ExecuteScript(object parameter, object o)
981 { 971 {
982 var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); 972 var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>();
@@ -1079,7 +1069,7 @@ GO @@ -1079,7 +1069,7 @@ GO
1079 } 1069 }
1080 return returnkey != null; 1070 return returnkey != null;
1081 } 1071 }
1082 - 1072 + #endregion ExecuteScript
1083 private static object DropDB(object parameter, object o) 1073 private static object DropDB(object parameter, object o)
1084 { 1074 {
1085 var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); 1075 var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>();
@@ -1255,6 +1245,30 @@ GO @@ -1255,6 +1245,30 @@ GO
1255 #endregion First level Executors with UI 1245 #endregion First level Executors with UI
1256 1246
1257 #region private methods 1247 #region private methods
  1248 + private static bool NoDBNameSpecified(SQLDataBase ssqldb)
  1249 + {
  1250 + const string FUNNOTAVAILTXT = "Function is not available for server connection strings wit no DB name specified!";
  1251 + if (string.IsNullOrWhiteSpace(SQLDataBaseManagerCore.GetDBName(ssqldb.SQLCS))) { ColorConsole.WriteLine(FUNNOTAVAILTXT, ConsoleColor.Red); ssqldb.DBName = "master"; return true; }
  1252 + return false;
  1253 + }
  1254 + public static void Execute(string key, bool enabledbbackup, bool enablescriptbackup, bool enabletabledatabackup, string targetfolder=null,DateTime? timestamp = null)
  1255 + {
  1256 + var packagets = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss");
  1257 + var config = new SQLDataBaseManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU");
  1258 + var origsqld = config.GetDefinitionList().FirstOrDefault(x => x.Xml_Key == key);
  1259 + if (origsqld != null)
  1260 + {
  1261 + var sqld = new SQLDataBase(origsqld);
  1262 + var dbname = SQLDataBaseManagerCore.GetDBName(sqld.SQLCS);
  1263 + ColorConsole.WriteLine($"Database backup process started. DB key:'{key}', name:'{dbname}'...", ConsoleColor.Yellow);
  1264 + if (!string.IsNullOrWhiteSpace(targetfolder)) { sqld.Xml_BackupTargetDirectoryPath = targetfolder; }
  1265 + if (enabledbbackup) { SQLDataBaseManagerCore.CreateBackup(sqld,null, timestamp); }
  1266 + if (enablescriptbackup) { SQLDataBaseManagerCore.BackupSqlScripts(sqld, timestamp); }
  1267 + if (enabletabledatabackup) { SQLDataBaseManagerCore.BackupSqlData(sqld, timestamp); }
  1268 + ColorConsole.WriteLine($"Database backup process finished!", ConsoleColor.DarkGreen);
  1269 + }
  1270 + else { ColorConsole.WriteLine($"Database backup process error. DB key incorrect:'{key}'...", ConsoleColor.Red); }
  1271 + }
1258 #region private DisplaySQLDataBaseMenu 1272 #region private DisplaySQLDataBaseMenu
1259 private static void DataBaseListDisplayer() { DisplaySQLDataBaseMenu(); } 1273 private static void DataBaseListDisplayer() { DisplaySQLDataBaseMenu(); }
1260 private static Menu DisplaySQLDataBaseMenu(SQLDataBaseManagerXmlProcessor config = null, string prompt = null, bool silent = false, Menu.SelectionMode selectionmode = Menu.SelectionMode.Multi) 1274 private static Menu DisplaySQLDataBaseMenu(SQLDataBaseManagerXmlProcessor config = null, string prompt = null, bool silent = false, Menu.SelectionMode selectionmode = Menu.SelectionMode.Multi)
@@ -1778,14 +1792,14 @@ GO @@ -1778,14 +1792,14 @@ GO
1778 } 1792 }
1779 finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } 1793 finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); }
1780 } 1794 }
1781 - public static void CreateServerLogins(bool emulation, string sqlcs, string[] usernamelist,string[] loginrolelist, string[] fullaccessrolelist) 1795 + public static void CreateServerAndDBLogins(bool emulation, string sqlcs, string[] usernamelist,string[] serverloginrolelist, string[] dbloginrolelist)
1782 { 1796 {
1783 foreach (var username in usernamelist) 1797 foreach (var username in usernamelist)
1784 { 1798 {
1785 - ColorConsole.WriteLine(username, ConsoleColor.Yellow, prefix: nameof(SQLDataBaseManagerCore.CreateUser) + ":");  
1786 - try { if (!emulation) SQLDataBaseManagerCore.CreateLogin(sqlcs, username, null, "master", LoginType.WindowsUser, loginrolelist); } 1799 + ColorConsole.WriteLine(username, ConsoleColor.Yellow, prefix: nameof(SQLDataBaseManagerCore.CreateServerAndDBLogins) + ":");
  1800 + try { if (!emulation) SQLDataBaseManagerCore.CreateLogin(sqlcs, username, null, "master", LoginType.WindowsUser, serverloginrolelist); }
1787 catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateLogin) + ">>>: " + ex.MessageNested(), ConsoleColor.Red); } 1801 catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateLogin) + ">>>: " + ex.MessageNested(), ConsoleColor.Red); }
1788 - try { if (!emulation) SQLDataBaseManagerCore.CreateUser(sqlcs, username, string.Join(",", fullaccessrolelist), "w"); } 1802 + try { if (!emulation) SQLDataBaseManagerCore.CreateUser(sqlcs, username, string.Join(",", dbloginrolelist), "w"); }
1789 catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateUser) + "\n" + ex.MessageNested(), ConsoleColor.Red); } 1803 catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateUser) + "\n" + ex.MessageNested(), ConsoleColor.Red); }
1790 } 1804 }
1791 } 1805 }
@@ -2060,7 +2074,7 @@ GO @@ -2060,7 +2074,7 @@ GO
2060 sqltxt = Tools.KvpString.Substitute($"{RUNNINGMODE}={RUNNINGMODE_ONERUN};{RUNNINGMODE_ONERUN_PARAMETER_DELETEBEFOREDATE}={limitdatefornextrun:s};", sqltxtalmostresolved); 2074 sqltxt = Tools.KvpString.Substitute($"{RUNNINGMODE}={RUNNINGMODE_ONERUN};{RUNNINGMODE_ONERUN_PARAMETER_DELETEBEFOREDATE}={limitdatefornextrun:s};", sqltxtalmostresolved);
2061 if (sqltxt == null) { return Finalize(1, Add(multirunresult, ERRMSG_NOTHINGTOEXECUTE)); } //won't really get, but we never know... 2075 if (sqltxt == null) { return Finalize(1, Add(multirunresult, ERRMSG_NOTHINGTOEXECUTE)); } //won't really get, but we never know...
2062 ret1 = ExecuteSQLScript(sqlc, sqltxt, sqlscript.CommandTimeout, null); 2076 ret1 = ExecuteSQLScript(sqlc, sqltxt, sqlscript.CommandTimeout, null);
2063 - Add(loople, $"LIMITDATE", limitdatefornextrun.ToString()); 2077 + Add(loople, $"LIMITDATE", limitdatefornextrun.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
2064 Add(loople, $"RETCODE", ret1.ReturnValue.ToString()); 2078 Add(loople, $"RETCODE", ret1.ReturnValue.ToString());
2065 Add(loople, $"RETMSG", ret1.ReturnMessage); 2079 Add(loople, $"RETMSG", ret1.ReturnMessage);
2066 Add(loople, $"PROCESSINGTIME", DateTime.Now.Subtract(loopstart).ToString()); 2080 Add(loople, $"PROCESSINGTIME", DateTime.Now.Subtract(loopstart).ToString());
@@ -2098,7 +2112,7 @@ GO @@ -2098,7 +2112,7 @@ GO
2098 2112
2099 Add(multirunresult, $"NUMOFRUNS", deleteruncounter.ToString()); 2113 Add(multirunresult, $"NUMOFRUNS", deleteruncounter.ToString());
2100 Add(multirunresult, $"DBRECORDS", $"{numoftotaldbrecords_before}-->{numoftotaldbrecords_after} (total:{numoftotaldbrecords_after-numoftotaldbrecords_before})"); 2114 Add(multirunresult, $"DBRECORDS", $"{numoftotaldbrecords_before}-->{numoftotaldbrecords_after} (total:{numoftotaldbrecords_after-numoftotaldbrecords_before})");
2101 - Add(multirunresult, $"MINDATE", $"{mindateTS_before}-->{mindateTS_after}"); 2115 + Add(multirunresult, $"MINDATE", $"{mindateTS_before.ToString("yyyy-MM-ddTHH:mm:ss.fff")}-->{mindateTS_after.ToString("yyyy-MM-ddTHH:mm:ss.fff")}");
2102 Add(multirunresult, $"PROCESSINGTIME", $"{DateTime.Now.Subtract(starttime)}"); 2116 Add(multirunresult, $"PROCESSINGTIME", $"{DateTime.Now.Subtract(starttime)}");
2103 return Finalize(0, multirunresult); 2117 return Finalize(0, multirunresult);
2104 } 2118 }
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.31.7.0")]  
36 -[assembly: AssemblyFileVersion("1.31.7.0")] 35 +[assembly: AssemblyVersion("1.31.8.0")]
  36 +[assembly: AssemblyFileVersion("1.31.8.0")]