Commit 25232c9b5cc3ad3c77827aa53068cf69fed7385b
1 parent
f3c3c32f
v1.29.0.0
- DBUser és ServerLogin létrehozás xml-ben definiálható
Showing
2 changed files
with
548 additions
and
140 deletions
Show diff stats
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
... | ... | @@ -267,6 +267,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS |
267 | 267 | catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
268 | 268 | return o; |
269 | 269 | } |
270 | + | |
271 | + #region CreateServerLogin | |
270 | 272 | private static object CreateServerLogin(object parameter, object o) |
271 | 273 | { |
272 | 274 | var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); |
... | ... | @@ -280,17 +282,54 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS |
280 | 282 | else if (sr.SelectedParameterList?.FirstOrDefault() == null) { return o; } |
281 | 283 | else if (sr.Result == Menu.SelectionResult.Ok) { } |
282 | 284 | else { } |
283 | - string dbusername; | |
284 | - string password; | |
285 | - LoginType logintype; | |
286 | - | |
287 | 285 | var p = sr.SelectedParameterList.FirstOrDefault(); |
288 | 286 | SQLDataBase sqld = p.Parameters as SQLDataBase; |
289 | 287 | |
290 | - parameterinputloop: | |
291 | - try | |
288 | + getparametersloop: | |
289 | + List<SQLDataBase.ServerLogin> ServerLoginsToExecuteList = new List<SQLDataBase.ServerLogin>(); | |
290 | + string selectedserverloginkey = null; | |
291 | + if (sqld.Xml_SQLServerLoginList.Count == 0) | |
292 | 292 | { |
293 | - ColorConsole.WriteLine(prefix: $"Enter the parameters for creating server login: {sqld.DBName}. Format:", bracket: "()", text: "LOGINNAME[,PASSWORD][GRANTORUSER[,GRANTORUSERPASSWORD]]", f: ConsoleColor.Yellow); | |
293 | + ColorConsole.WriteLine($"There are no server logins defined for database. Name:{sqld.DBName}, server: {sqld.DataSource}", ConsoleColor.Red); | |
294 | + } | |
295 | + else | |
296 | + { | |
297 | + string SRVRLogin_db = sqld.DBName; | |
298 | + ColorConsole.WriteLine(); | |
299 | + ColorConsole.WriteLine($"Select the server login for database. Name:{sqld.DBName}, server: {sqld.DataSource}", ConsoleColor.Yellow); | |
300 | + var validkeylist = new List<string>(); | |
301 | + foreach (SQLDataBase.ServerLogin srvrlogin in sqld.Xml_SQLServerLoginList) | |
302 | + { | |
303 | + ColorConsole.Write($"#{srvrlogin.Key}", ConsoleColor.Yellow, bracket: "[]", suffix: $" [{srvrlogin.LoginName}] login, default database:[{srvrlogin.DefaultDatabase}], grantor user: [{srvrlogin.GrantorUserLoginName}]", prefix: " "); | |
304 | + ColorConsole.WriteLine(); | |
305 | + validkeylist.Add(srvrlogin.Key); | |
306 | + } | |
307 | + validkeylist.Add("*"); | |
308 | + selectedserverloginkey = ColorConsole.ReadLine("Select the server login! [empty]=set manually, [*]=all, [EX]=exit.", ConsoleColor.Yellow, prefix: " ", suffix: " --> ", validitylist: validkeylist); | |
309 | + if (selectedserverloginkey.ToUpper() == "EX") { return o; } | |
310 | + else if (selectedserverloginkey == "*") | |
311 | + { | |
312 | + foreach (var srvrlogin in sqld.Xml_SQLServerLoginList) | |
313 | + { | |
314 | + srvrlogin.Db = SRVRLogin_db; | |
315 | + string optioncommalist = $"{srvrlogin.LoginName},{srvrlogin.LoginPassword},{srvrlogin.GrantorUserLoginName},{srvrlogin.GrantorUserLoginPassword},{srvrlogin.DefaultDatabase}"; | |
316 | + SQLDataBase.ServerLogin SRVRLogin = CheckParametersXml(sqld.DBName, optioncommalist); | |
317 | + if (SRVRLogin != null) { ServerLoginsToExecuteList.Add(srvrlogin); } | |
318 | + } | |
319 | + } | |
320 | + else if (!string.IsNullOrWhiteSpace(selectedserverloginkey)) | |
321 | + { | |
322 | + SQLDataBase.ServerLogin SRVRLogin = sqld.Xml_SQLServerLoginList.FirstOrDefault(t => t.Key == selectedserverloginkey); | |
323 | + if (SRVRLogin == null) { ColorConsole.WriteLine($"The selected server login key is not valid!. DB Name:{sqld.DBName}, server: {sqld.DataSource}", ConsoleColor.Red); goto getparametersloop; } | |
324 | + string optionlist = $"{SRVRLogin.LoginName},{SRVRLogin.LoginPassword},{SRVRLogin.GrantorUserLoginName},{SRVRLogin.GrantorUserLoginPassword},"; | |
325 | + SRVRLogin.Db = SRVRLogin_db; | |
326 | + ServerLoginsToExecuteList.Add(SRVRLogin); | |
327 | + } | |
328 | + } | |
329 | + | |
330 | + if (string.IsNullOrWhiteSpace(selectedserverloginkey)) | |
331 | + { | |
332 | + ColorConsole.WriteLine(prefix: $"Enter the parameters for creating server login: {sqld.DBName}. Format:", bracket: "()", text: "LOGINNAME[,PASSWORD][,GRANTORUSER[,GRANTORUSERPASSWORD]]", f: ConsoleColor.Yellow); | |
294 | 333 | ColorConsole.WriteLine(prefix: " ", text: "LOGINNAME", bracket: "", suffix: $": server login name"); |
295 | 334 | ColorConsole.WriteLine(prefix: " ", text: "PASSWORD", bracket: "", suffix: $": password for login; empty=windows login is created, non empty=sql login is created"); |
296 | 335 | ColorConsole.WriteLine(prefix: " ", text: "GRANTORUSER", bracket: "", suffix: $": name of the user in behalf the login is created (that logs in the sql server); default:current user with windows authentication"); |
... | ... | @@ -299,122 +338,297 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS |
299 | 338 | var createuseroptions = ColorConsole.ReadLine($"EX=exit.", ConsoleColor.Yellow, suffix: " --> "); |
300 | 339 | if (createuseroptions.ToUpper() == "EX") { return o; } |
301 | 340 | |
302 | - dbusername = null; | |
303 | - password = null; | |
304 | - logintype = LoginType.WindowsUser; | |
305 | 341 | |
306 | - var optionList = createuseroptions.Split(new char[] { ',' }, StringSplitOptions.None); | |
307 | - if (optionList.Length < 1) { ColorConsole.WriteLine("ERROR! LOGINNAME is required, PASSWORD is optional", ConsoleColor.Red); goto parameterinputloop; } | |
342 | + SQLDataBase.ServerLogin SRVRLogin = CheckParametersInteractive(sqld.DBName, createuseroptions); | |
343 | + if (SRVRLogin==null) goto getparametersloop; | |
344 | + ServerLoginsToExecuteList.Add(SRVRLogin); | |
345 | + } | |
308 | 346 | |
309 | - dbusername = optionList[0]; | |
310 | - if (optionList.Length == 2) | |
311 | - { | |
312 | - password = optionList[1]; | |
313 | - if (string.IsNullOrWhiteSpace(password)) { ColorConsole.WriteLine("ERROR! PASSWORD, if set, may not be empty!", ConsoleColor.Red); goto parameterinputloop; } | |
314 | - logintype = LoginType.SqlLogin; | |
347 | + bool allconfirmed = false; | |
348 | + foreach (var SrvrLoginToExecute in ServerLoginsToExecuteList) | |
349 | + { | |
350 | + var retcode = ExecuteOneServerLogin(sqld.SQLCS, SrvrLoginToExecute, allconfirmed); | |
351 | + if (retcode == "EX") return o; | |
352 | + else if (retcode == "ALL") { allconfirmed = true; } | |
353 | + else if (retcode != null) goto getparametersloop; | |
354 | + } | |
355 | + return o; | |
356 | + } | |
357 | + private static SQLDataBase.ServerLogin CheckParametersInteractive(string dbname,string optioncommalist) | |
358 | + { | |
359 | + var optionList = optioncommalist.Split(new char[] { ',' }, StringSplitOptions.None); | |
360 | + if (optionList.Length < 1) { ColorConsole.WriteLine("ERROR! LOGINNAME is required, PASSWORD is optional", ConsoleColor.Red); return null; } | |
361 | + | |
362 | + string SRVRLogin_loginname = optionList[0]; | |
363 | + string SRVRLogin_loginpsw = null; | |
364 | + string SRVRLogin_grantoruserloginname = null; | |
365 | + string SRVRLogin_grantoruserpsw = null; | |
366 | + if (optionList.Length > 3) | |
367 | + { | |
368 | + SRVRLogin_grantoruserpsw = optionList[3]; | |
369 | + if (string.IsNullOrWhiteSpace(SRVRLogin_grantoruserpsw)) { ColorConsole.WriteLine("ERROR! GRANTORUSERPASSWORD, if set, may not be empty!", ConsoleColor.Red); return null; } | |
370 | + } | |
371 | + if (optionList.Length > 2) | |
372 | + { | |
373 | + SRVRLogin_grantoruserloginname = optionList[2]; | |
374 | + if (string.IsNullOrWhiteSpace(SRVRLogin_grantoruserloginname)) { ColorConsole.WriteLine("ERROR! GRANTORUSER, if set, may not be empty!", ConsoleColor.Red); return null; } | |
375 | + } | |
376 | + if (optionList.Length > 1) | |
377 | + { | |
378 | + SRVRLogin_loginpsw = optionList[1]; | |
379 | + if (string.IsNullOrWhiteSpace(SRVRLogin_loginpsw)) { ColorConsole.WriteLine("ERROR! PASSWORD, if set, may not be empty!", ConsoleColor.Red); return null; } | |
380 | + } | |
381 | + | |
382 | + LoginType SRVRLogin_logintype = LoginType.WindowsUser; | |
383 | + if (string.IsNullOrWhiteSpace(SRVRLogin_grantoruserloginname) && string.IsNullOrWhiteSpace(SRVRLogin_grantoruserpsw)) { SRVRLogin_logintype = LoginType.SqlLogin; } | |
384 | + | |
385 | + bool SRVRLogin_removeaction = false; | |
386 | + string SRVRLogin_defaultdb = "master"; | |
387 | + | |
388 | + return new SQLDataBase.ServerLogin() | |
389 | + { | |
390 | + Db = dbname | |
391 | + , LoginName = SRVRLogin_loginname | |
392 | + , LoginPassword = SRVRLogin_loginpsw | |
393 | + , LoginType = SRVRLogin_logintype | |
394 | + , GrantorUserLoginName = SRVRLogin_grantoruserloginname | |
395 | + , GrantorUserLoginPassword = SRVRLogin_grantoruserpsw | |
396 | + , DefaultDatabase = SRVRLogin_defaultdb | |
397 | + , Remove = SRVRLogin_removeaction | |
398 | + }; | |
399 | + } | |
400 | + private static SQLDataBase.ServerLogin CheckParametersXml(string dbname, string optioncommalist) | |
401 | + { | |
402 | + var optionList = optioncommalist.Split(new char[] { ',' }, StringSplitOptions.None); | |
403 | + if (optionList.Length < 1) { ColorConsole.WriteLine("ERROR! LOGINNAME is required, PASSWORD is optional", ConsoleColor.Red); return null; } | |
404 | + | |
405 | + string SRVRLogin_loginname = optionList[0]; | |
406 | + string SRVRLogin_loginpsw = optionList[1]; | |
407 | + string SRVRLogin_grantoruserloginname = optionList[2]; | |
408 | + string SRVRLogin_grantoruserpsw = optionList[3]; | |
409 | + string SRVRLogin_defaultdb = optionList[4]; | |
410 | + | |
411 | + if (string.IsNullOrWhiteSpace(SRVRLogin_loginname)) { ColorConsole.WriteLine("ERROR! LOGIN NAME is mandatory!", ConsoleColor.Red); return null; } | |
412 | + if (string.IsNullOrWhiteSpace(SRVRLogin_loginpsw)) { ColorConsole.WriteLine("ERROR! LOGIN PASSWORD is mandatory!", ConsoleColor.Red); return null; } | |
413 | + if (!string.IsNullOrWhiteSpace(SRVRLogin_grantoruserloginname) && string.IsNullOrWhiteSpace(SRVRLogin_grantoruserpsw) || string.IsNullOrWhiteSpace(SRVRLogin_grantoruserloginname) && !string.IsNullOrWhiteSpace(SRVRLogin_grantoruserpsw)) | |
414 | + { | |
415 | + ColorConsole.WriteLine("ERROR! GRANTORUSER/GRANTORUSERPASSWORD, both must be empty or both must be non-empty!", ConsoleColor.Red); return null; | |
416 | + } | |
417 | + if (string.IsNullOrWhiteSpace(SRVRLogin_defaultdb)) { SRVRLogin_defaultdb="master"; } | |
418 | + | |
419 | + LoginType SRVRLogin_logintype = LoginType.WindowsUser; | |
420 | + if (string.IsNullOrWhiteSpace(SRVRLogin_grantoruserloginname) && string.IsNullOrWhiteSpace(SRVRLogin_grantoruserpsw)) { SRVRLogin_logintype = LoginType.SqlLogin; } | |
421 | + | |
422 | + bool SRVRLogin_removeaction = false; | |
423 | + | |
424 | + return new SQLDataBase.ServerLogin() | |
425 | + { | |
426 | + Db = dbname | |
427 | + , LoginName = SRVRLogin_loginname | |
428 | + , LoginPassword = SRVRLogin_loginpsw | |
429 | + , LoginType = SRVRLogin_logintype | |
430 | + , GrantorUserLoginName = SRVRLogin_grantoruserloginname | |
431 | + , GrantorUserLoginPassword = SRVRLogin_grantoruserpsw | |
432 | + , DefaultDatabase = SRVRLogin_defaultdb | |
433 | + , Remove = SRVRLogin_removeaction | |
434 | + }; | |
435 | + } | |
436 | + private static string ExecuteOneServerLogin(string sqlcs, SQLDataBase.ServerLogin srvrlogintoexecute, bool allconfirmed) | |
437 | + { | |
438 | + string returntext = null; | |
439 | + try | |
440 | + { | |
441 | + string removeactionText = srvrlogintoexecute.Remove ? "REMOVE" : "CREATE"; | |
442 | + string passwordtext = srvrlogintoexecute.LoginType == LoginType.WindowsUser ? "" : $", password:{srvrlogintoexecute.LoginPassword}"; | |
443 | + string SRVRLogin_fulldesignation = $"db={srvrlogintoexecute.Db},login name={srvrlogintoexecute.LoginName},login type: {srvrlogintoexecute.LoginType}{passwordtext}"; | |
444 | + if (!allconfirmed) | |
445 | + { | |
446 | + ColorConsole.WriteLine(); | |
447 | + ColorConsole.WriteLine(prefix: $"Action to execute:{removeactionText}.", text: $" {SRVRLogin_fulldesignation}.", bracket: "", suffix: $""); | |
448 | + var confirm = ColorConsole.ReadLine($"Enter CONFIRM to confirm, ALL to confirm all, SKIP to continue.", ConsoleColor.Yellow, suffix: ""); | |
449 | + if (confirm.ToUpper() == "EX") { return "EX"; } | |
450 | + else if (confirm.ToUpper() == "CONFIRM") { returntext = null; } | |
451 | + else if (confirm.ToUpper() == "ALL") { returntext = "ALL"; } | |
452 | + else { return null; } | |
315 | 453 | } |
316 | - string grantoruser = null; | |
317 | - string grantoruserpsw = null; | |
318 | - if (optionList.Length > 2) | |
454 | + | |
455 | + if (!srvrlogintoexecute.Remove) | |
319 | 456 | { |
320 | - grantoruser = optionList[2]; | |
321 | - if (string.IsNullOrWhiteSpace(grantoruser)) { ColorConsole.WriteLine("ERROR! GRANTORUSER, if set, may not be empty!", ConsoleColor.Red); goto parameterinputloop; } | |
457 | + SQLDataBaseManagerCore.CreateLogin(sqlcs, srvrlogintoexecute.LoginName, srvrlogintoexecute.LoginPassword, srvrlogintoexecute.DefaultDatabase, srvrlogintoexecute.LoginType, null, srvrlogintoexecute.GrantorUserLoginName, srvrlogintoexecute.GrantorUserLoginPassword); | |
458 | + ColorConsole.WriteLine($"SUCCESS! {removeactionText} server login: {SRVRLogin_fulldesignation}", ConsoleColor.Green); | |
322 | 459 | } |
323 | - if (optionList.Length > 3) | |
460 | + else | |
324 | 461 | { |
325 | - grantoruserpsw = optionList[3]; | |
326 | - if (string.IsNullOrWhiteSpace(grantoruser)) { ColorConsole.WriteLine("ERROR! GRANTORUSERPASSWORD, if set, may not be empty!", ConsoleColor.Red); goto parameterinputloop; } | |
462 | + ColorConsole.WriteLine($"Function remove DB user is not yet implemented!", ConsoleColor.Red); | |
327 | 463 | } |
328 | - | |
329 | - SQLDataBaseManagerCore.CreateLogin(sqld.SQLCS, dbusername, password, "master", logintype, null,grantoruser,grantoruserpsw); | |
330 | - string passwordtext = logintype == LoginType.WindowsUser ? "" : $", password:{password}"; | |
331 | - ColorConsole.WriteLine($"Server login created. Server login name:{dbusername}, login type: {logintype}{passwordtext}.", ConsoleColor.Green); | |
332 | 464 | } |
333 | - catch (Exception ex) | |
334 | - { | |
335 | - ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); | |
336 | - goto parameterinputloop; | |
337 | - } | |
338 | - goto parameterinputloop; | |
339 | - | |
465 | + catch (ApplicationException e) { ColorConsole.WriteLine("FATAL ERROR! in script parameter substitution!", ConsoleColor.Red); returntext = null; } | |
466 | + catch (Exception e) { ColorConsole.WriteLine("FATAL ERROR! " + e.MessageNested(), ConsoleColor.Red); returntext = null; } | |
467 | + return returntext; | |
340 | 468 | } |
469 | + #endregion CreateServerLogin | |
470 | + | |
471 | + #region CreateDBUser | |
341 | 472 | 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", }; |
342 | 473 | private static string[] fullaccessrolelist = new string[] { "db_accessadmin", "db_backupoperator", "db_datareader", "db_datawriter", "db_ddladmin", "db_owner", "db_securityadmin", }; |
343 | - private static string[] datareaderrolelist = new string[] { "db_datareader", "db_denydatareader", }; | |
474 | + private static string[] datareaderrolelist = new string[] { "db_datareader", }; | |
344 | 475 | private static string[] loginrolelist = new string[] { "dbcreator", "securityadmin", }; |
476 | + private const string COMMA = ","; | |
345 | 477 | private static object CreateDBUser(object parameter, object o) |
346 | 478 | { |
347 | - const string COMMA = ","; | |
348 | 479 | var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); |
349 | 480 | var args = (parameter as Menu.ExecutorParameter).Args; |
350 | - var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS); | |
481 | + var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES); | |
351 | 482 | var menuofdbs = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function '{nameof(CreateDBUser)}'!", silent: true, selectionmode: Menu.SelectionMode.Single); |
352 | - Menu.Selection sr = menuofdbs.Select(selectedtaskindexes); | |
483 | + Menu.Selection sr = menuofdbs.Select(selectedsqldbindexes); | |
353 | 484 | if (sr.Result == Menu.SelectionResult.Exit) { return o; } |
354 | 485 | else if (sr.Result == Menu.SelectionResult.None) { return o; } |
355 | 486 | else if (sr.Result == Menu.SelectionResult.Error) { return o; } |
356 | 487 | else if (sr.SelectedParameterList?.FirstOrDefault() == null) { return o; } |
357 | 488 | else if (sr.Result == Menu.SelectionResult.Ok) { } |
358 | 489 | else { } |
359 | - string dbusername = null; | |
360 | - string loginname = null; | |
361 | - string rolenamecommalist = null; | |
490 | + string DBUser_UserName = null; | |
491 | + string DBUser_LoginName = null; | |
492 | + string DBUser_RoleNameCommaList = null; | |
362 | 493 | |
363 | 494 | var p = sr.SelectedParameterList.FirstOrDefault(); |
364 | 495 | SQLDataBase sqld = p.Parameters as SQLDataBase; |
365 | 496 | |
366 | - parameterinputloop: | |
367 | - try | |
497 | + getparametersloop: | |
498 | + List<SQLDataBase.DBUser> DbusrToExecuteList = new List<SQLDataBase.DBUser>(); | |
499 | + string selecteddbusrkey = null; | |
500 | + if (sqld.Xml_SQLDbUserList.Count == 0) | |
501 | + { | |
502 | + ColorConsole.WriteLine($"There are no DBUsers defined for database. Name:{sqld.DBName}, server: {sqld.DataSource}", ConsoleColor.Red); | |
503 | + } | |
504 | + else | |
505 | + { | |
506 | + string DBUser_db = sqld.DBName; | |
507 | + ColorConsole.WriteLine(); | |
508 | + ColorConsole.WriteLine($"Select the DBUser for database. Name:{sqld.DBName}, server: {sqld.DataSource}", ConsoleColor.Yellow); | |
509 | + var validkeylist = new List<string>(); | |
510 | + foreach (SQLDataBase.DBUser dbusr in sqld.Xml_SQLDbUserList) | |
511 | + { | |
512 | + ColorConsole.Write($"#{dbusr.Key}", ConsoleColor.Yellow, bracket: "[]", suffix: $" [{dbusr.UserName}] database user for login [{dbusr.LoginName}]", prefix: " "); | |
513 | + ColorConsole.WriteLine(); | |
514 | + validkeylist.Add(dbusr.Key); | |
515 | + } | |
516 | + validkeylist.Add("*"); | |
517 | + selecteddbusrkey = ColorConsole.ReadLine("Select the database user! [empty]=set manually, [*]=all, [EX]=exit.", ConsoleColor.Yellow, prefix: " ", suffix: " --> ", validitylist: validkeylist); | |
518 | + if (selecteddbusrkey.ToUpper() == "EX") { return o; } | |
519 | + else if (selecteddbusrkey == "*") | |
520 | + { | |
521 | + foreach (var dbusr in sqld.Xml_SQLDbUserList) | |
522 | + { | |
523 | + dbusr.Db = DBUser_db; | |
524 | + dbusr.RoleNameCommaList = ResolvePredefinedRoles(dbusr.RoleNameCommaList); | |
525 | + if (!string.IsNullOrWhiteSpace(dbusr.RoleNameCommaList)) { DbusrToExecuteList.Add(dbusr); } | |
526 | + } | |
527 | + } | |
528 | + else if (!string.IsNullOrWhiteSpace(selecteddbusrkey)) | |
529 | + { | |
530 | + SQLDataBase.DBUser DBUser = sqld.Xml_SQLDbUserList.FirstOrDefault(t => t.Key == selecteddbusrkey); | |
531 | + if (DBUser == null) { ColorConsole.WriteLine($"The selected dbuser key is not valid!. DB Name:{sqld.DBName}, server: {sqld.DataSource}", ConsoleColor.Red); goto getparametersloop; } | |
532 | + DBUser.Db = DBUser_db; | |
533 | + DbusrToExecuteList.Add(DBUser); | |
534 | + } | |
535 | + } | |
536 | + | |
537 | + if (string.IsNullOrWhiteSpace(selecteddbusrkey)) | |
368 | 538 | { |
369 | 539 | ColorConsole.WriteLine(prefix: $"Enter the parameters for creating DB user for: {sqld.DBName}. Format:", bracket: "()", text: "DBUSERNAME,SERVERLOGINNAME,ROLENAME,ROLENAME,ROLENAME...", f: ConsoleColor.Yellow); |
370 | 540 | ColorConsole.WriteLine(prefix: " ", text: "DBUSERNAME", bracket: "", suffix: $": dbusername."); |
371 | - ColorConsole.WriteLine(prefix: " ", text: "SERVERLOGINNAME", bracket: "", suffix: $": serverlogin name; empty=SQL user w/o login,w=WIndows user, other=SQL user for this server login name(* means server login name equals to dbusername)."); | |
541 | + ColorConsole.WriteLine(prefix: " ", text: "SERVERLOGINNAME", bracket: "", suffix: $": serverlogin name; empty=SQL user w/o login,w=Windows user, other=SQL user for this server login name(* means server login name equals to dbusername)."); | |
372 | 542 | ColorConsole.WriteLine(prefix: " ", text: "ROLENAME", bracket: "", suffix: $": One of these->" + string.Join(COMMA, selectablerolelist)); |
373 | 543 | |
374 | 544 | var createuseroptions = ColorConsole.ReadLine($"EX=exit.", ConsoleColor.Yellow, suffix: " --> "); |
375 | 545 | if (createuseroptions.ToUpper() == "EX") { return o; } |
376 | 546 | |
377 | - dbusername = null; | |
378 | - loginname = null; | |
379 | - rolenamecommalist = null; | |
547 | + DBUser_UserName = null; | |
548 | + DBUser_LoginName = null; | |
549 | + DBUser_RoleNameCommaList = null; | |
380 | 550 | var optionList = createuseroptions.Split(new char[] { ',' }, StringSplitOptions.None); |
381 | - if (optionList.Length < 3) { ColorConsole.WriteLine("ERROR! DBUSERNAME,SERVERLOGINNAME and at least one ROLENAME are required", ConsoleColor.Red); goto parameterinputloop; } | |
551 | + if (optionList.Length < 3) { ColorConsole.WriteLine("ERROR! DBUSERNAME,SERVERLOGINNAME and at least one ROLENAME are required", ConsoleColor.Red); goto getparametersloop; } | |
382 | 552 | //012345678 |
383 | 553 | //uuu,ppp,r1,r2,r3 |
384 | - dbusername = optionList[0]; | |
385 | - loginname = optionList[1]; | |
386 | - var selectedrolelist = optionList.Skip(2).ToArray(); | |
387 | - List<string> badrolenames = new List<string>(); | |
388 | - bool enablefullaccess = false; | |
389 | - bool enabledatareader = false; | |
390 | - int selectedrolelistnum = 0; | |
391 | - foreach (var rolename in selectedrolelist) | |
392 | - { | |
393 | - selectedrolelistnum++; | |
394 | - enablefullaccess = enablefullaccess || rolename.ToUpper() == "FULLACCESS"; | |
395 | - enabledatareader = enabledatareader || rolename.ToUpper() == "DATAREADER"; | |
396 | - if (!selectablerolelist.Contains(rolename)) { badrolenames.Add(rolename); } | |
397 | - } | |
398 | - bool specialselectionactive = enablefullaccess || enabledatareader; | |
399 | - if (selectedrolelistnum > 1 && specialselectionactive) { ColorConsole.WriteLine($"ERROR! FULLACCESS or DATAREADER has to be selected alone!", ConsoleColor.Red); goto parameterinputloop; } | |
400 | - if (badrolenames.Count > 0) { ColorConsole.WriteLine($"ERROR! {string.Join(COMMA, badrolenames)} are not available!", ConsoleColor.Red); goto parameterinputloop; } | |
554 | + DBUser_UserName = optionList[0]; | |
555 | + DBUser_LoginName = optionList[1]; | |
556 | + DBUser_RoleNameCommaList = ResolvePredefinedRoles(string.Join(COMMA, optionList.Skip(2))); | |
557 | + if (string.IsNullOrWhiteSpace(DBUser_RoleNameCommaList)) goto getparametersloop; | |
558 | + bool DBUser_Removeaction = false; | |
401 | 559 | |
402 | - var effectiverolelist = | |
403 | - enablefullaccess ? fullaccessrolelist | |
404 | - : enabledatareader ? datareaderrolelist | |
405 | - : selectedrolelist; | |
406 | - rolenamecommalist = string.Join(",", effectiverolelist); | |
560 | + SQLDataBase.DBUser DBUser = new SQLDataBase.DBUser() { Db = sqld.DBName, UserName = DBUser_UserName, LoginName = DBUser_LoginName, RoleNameCommaList = DBUser_RoleNameCommaList, Remove = DBUser_Removeaction, }; | |
561 | + DbusrToExecuteList.Add(DBUser); | |
562 | + } | |
407 | 563 | |
408 | - SQLDataBaseManagerCore.CreateUser(sqld.SQLCS, dbusername, rolenamecommalist, loginname); | |
409 | - ColorConsole.WriteLine($"DB user created. DB name:{sqld.DBName}, DB username:{dbusername}, rolelist={rolenamecommalist}.", ConsoleColor.Green); | |
564 | + bool allconfirmed = false; | |
565 | + foreach (var DbusrToExecute in DbusrToExecuteList) | |
566 | + { | |
567 | + var retcode = ExecuteOneDBUser(sqld.SQLCS, DbusrToExecute, allconfirmed); | |
568 | + if (retcode == "EX") return o; | |
569 | + else if (retcode == "ALL") { allconfirmed = true; } | |
570 | + else if (retcode != null) goto getparametersloop; | |
410 | 571 | } |
411 | - catch (Exception ex) | |
572 | + return o; | |
573 | + } | |
574 | + private static string ResolvePredefinedRoles(string selectedrolecommalist) | |
575 | + { | |
576 | + var selectedrolelist = selectedrolecommalist.Split(',', ';'); | |
577 | + List<string> badrolenames = new List<string>(); | |
578 | + bool enablefullaccess = false; | |
579 | + bool enabledatareader = false; | |
580 | + int selectedrolelistnum = 0; | |
581 | + foreach (var rolename in selectedrolelist) | |
582 | + { | |
583 | + selectedrolelistnum++; | |
584 | + enablefullaccess = enablefullaccess || rolename.ToUpper() == "FULLACCESS"; | |
585 | + enabledatareader = enabledatareader || rolename.ToUpper() == "DATAREADER"; | |
586 | + if (!selectablerolelist.Contains(rolename)) { badrolenames.Add(rolename); } | |
587 | + } | |
588 | + bool specialselectionactive = enablefullaccess || enabledatareader; | |
589 | + if (selectedrolelistnum > 1 && specialselectionactive) { ColorConsole.WriteLine($"ERROR! FULLACCESS or DATAREADER has to be selected alone!", ConsoleColor.Red); return null; } | |
590 | + if (badrolenames.Count > 0) { ColorConsole.WriteLine($"ERROR! {string.Join(COMMA, badrolenames)} are not available!", ConsoleColor.Red); return null; } | |
591 | + var effectiverolelist = | |
592 | + enablefullaccess ? fullaccessrolelist | |
593 | + : enabledatareader ? datareaderrolelist | |
594 | + : selectedrolelist; | |
595 | + return string.Join(",", effectiverolelist); | |
596 | + } | |
597 | + private static string ExecuteOneDBUser(string sqlcs, SQLDataBase.DBUser dbusertoexecute, bool allconfirmed) | |
598 | + { | |
599 | + string returntext = null; | |
600 | + try | |
412 | 601 | { |
413 | - ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); | |
414 | - goto parameterinputloop; | |
602 | + string removeactionText = dbusertoexecute.Remove ? "REMOVE" : "CREATE"; | |
603 | + string DBUser_fulldesignation = $"db={dbusertoexecute.Db},username={dbusertoexecute.UserName},login name={dbusertoexecute.LoginName},role list={dbusertoexecute.RoleNameCommaList}"; | |
604 | + if (!allconfirmed) | |
605 | + { | |
606 | + ColorConsole.WriteLine(); | |
607 | + ColorConsole.WriteLine(prefix: $"Action to execute:{removeactionText}.", text: $" {DBUser_fulldesignation}.", bracket: "", suffix: $""); | |
608 | + var confirm = ColorConsole.ReadLine($"Enter CONFIRM to confirm, ALL to confirm all, SKIP to continue.", ConsoleColor.Yellow, suffix: ""); | |
609 | + if (confirm.ToUpper() == "EX") { return "EX"; } | |
610 | + else if (confirm.ToUpper() == "CONFIRM") { returntext = null; } | |
611 | + else if (confirm.ToUpper() == "ALL") { returntext = "ALL"; } | |
612 | + else { return null; } | |
613 | + } | |
614 | + | |
615 | + if (!dbusertoexecute.Remove) | |
616 | + { | |
617 | + SQLDataBaseManagerCore.CreateUser(sqlcs, dbusertoexecute.UserName, dbusertoexecute.RoleNameCommaList, dbusertoexecute.LoginName); | |
618 | + ColorConsole.WriteLine($"SUCCESS! {removeactionText} database user: {DBUser_fulldesignation}", ConsoleColor.Green); | |
619 | + } | |
620 | + else | |
621 | + { | |
622 | + ColorConsole.WriteLine($"Function remove DB user is not yet implemented!", ConsoleColor.Red); | |
623 | + } | |
415 | 624 | } |
416 | - goto parameterinputloop; | |
625 | + catch (ApplicationException e) { ColorConsole.WriteLine("FATAL ERROR! in script parameter substitution!", ConsoleColor.Red); returntext = null; } | |
626 | + catch (Exception e) { ColorConsole.WriteLine("FATAL ERROR! " + e.MessageNested(), ConsoleColor.Red); returntext = null; } | |
627 | + return returntext; | |
417 | 628 | } |
629 | + #endregion CreateDBUser | |
630 | + | |
631 | + #region MoveDbToRemoteServer | |
418 | 632 | private static object MoveDbToRemoteServer(object parameter, object o) |
419 | 633 | { |
420 | 634 | var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); |
... | ... | @@ -510,7 +724,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS |
510 | 724 | ColorConsole.WriteLine($"Moving DB to remote server completed. Required time: {(int)(DateTime.Now.Subtract(DateTimeNow).TotalSeconds)} seconds.",ConsoleColor.Green); |
511 | 725 | return o; |
512 | 726 | } |
727 | + #endregion MoveDbToRemoteServer | |
513 | 728 | |
729 | + #region ManageLastUpdatedTrigger | |
514 | 730 | private static object ManageLastUpdatedTrigger(object parameter, object o) { return _ManageLastUpdatedTrigger(parameter, o, null); } |
515 | 731 | #region script texts for _RemoveAndCreateLastUpdatedTrigger |
516 | 732 | const string Header_Script = |
... | ... | @@ -569,9 +785,9 @@ GO |
569 | 785 | { |
570 | 786 | var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); |
571 | 787 | var args = (parameter as Menu.ExecutorParameter).Args; |
572 | - var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS); | |
788 | + var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES); | |
573 | 789 | var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function '{nameof(ManageLastUpdatedTrigger)}'!", silent: true); |
574 | - Menu.Selection sr = menufolders.Select(selectedtaskindexes); | |
790 | + Menu.Selection sr = menufolders.Select(selectedsqldbindexes); | |
575 | 791 | if (sr.Result == Menu.SelectionResult.Exit) { return o; } |
576 | 792 | else if (sr.Result == Menu.SelectionResult.None) { return o; } |
577 | 793 | else if (sr.Result == Menu.SelectionResult.Error) { return o; } |
... | ... | @@ -581,13 +797,57 @@ GO |
581 | 797 | if (p == null) { return o; } |
582 | 798 | SQLDataBase sqld = p.Parameters as SQLDataBase; |
583 | 799 | |
584 | - var manageaction = !forceremoveonly.HasValue; | |
585 | - string actiontext = manageaction ? "MANAGING": (forceremoveonly.Value ? "REMOVING" : "CREATING"); | |
586 | - getparameters:; | |
587 | - try | |
800 | + getparametersloop:; | |
801 | + | |
802 | + List<SQLDataBase.LastUpdatedTrigger> TriggerToExecuteList = new List<SQLDataBase.LastUpdatedTrigger>(); | |
803 | + string selectedtrgkey =null; | |
804 | + if (sqld.Xml_SQLLastUpdatedTriggerList.Count == 0) | |
805 | + { | |
806 | + ColorConsole.WriteLine($"There are no LastUpdated triggers defined for database. Name:{sqld.DBName}, server: {sqld.DataSource}", ConsoleColor.Red); | |
807 | + } | |
808 | + else | |
809 | + { | |
810 | + string LastUpdatedTrigger_db = sqld.DBName; | |
811 | + ColorConsole.WriteLine(); | |
812 | + ColorConsole.WriteLine($"Select the LastUpdated triggers for database. Name:{sqld.DBName}, server: {sqld.DataSource}", ConsoleColor.Yellow); | |
813 | + var validkeylist = new List<string>(); | |
814 | + foreach (SQLDataBase.LastUpdatedTrigger trg in sqld.Xml_SQLLastUpdatedTriggerList) | |
815 | + { | |
816 | + ColorConsole.Write($"#{trg.Key}", ConsoleColor.Yellow, bracket: "[]", suffix: $" [{trg.Column}] column in table [{trg.Schema}].[{trg.Table}]", prefix: " "); | |
817 | + ColorConsole.WriteLine(); | |
818 | + validkeylist.Add(trg.Key); | |
819 | + } | |
820 | + validkeylist.Add("*"); | |
821 | + selectedtrgkey = ColorConsole.ReadLine("Select the trigger! [empty]=set manually, [*]=all, [EX]=exit.", ConsoleColor.Yellow, prefix: " ", suffix: " --> ", validitylist: validkeylist); | |
822 | + if (selectedtrgkey.ToUpper() == "EX") { return o; } | |
823 | + else if (selectedtrgkey == "*") | |
824 | + { | |
825 | + foreach (var trg in sqld.Xml_SQLLastUpdatedTriggerList) | |
826 | + { | |
827 | + trg.Db = LastUpdatedTrigger_db; | |
828 | + TriggerToExecuteList.Add(trg); | |
829 | + } | |
830 | + } | |
831 | + else if(!string.IsNullOrWhiteSpace(selectedtrgkey)) | |
832 | + { | |
833 | + SQLDataBase.LastUpdatedTrigger LastUpdatedTrigger = sqld.Xml_SQLLastUpdatedTriggerList.FirstOrDefault(t => t.Key == selectedtrgkey); | |
834 | + if (LastUpdatedTrigger == null) { ColorConsole.WriteLine($"The selected trigger is not valid!. Name:{sqld.DBName}, server: {sqld.DataSource}", ConsoleColor.Red); goto getparametersloop; } | |
835 | + LastUpdatedTrigger.Db = LastUpdatedTrigger_db; | |
836 | + TriggerToExecuteList.Add(LastUpdatedTrigger); | |
837 | + } | |
838 | + } | |
839 | + | |
840 | + if (string.IsNullOrWhiteSpace(selectedtrgkey)) | |
588 | 841 | { |
842 | + string LastUpdatedTrigger_db = sqld.DBName; | |
843 | + string LastUpdatedTrigger_schema = "dbo"; | |
844 | + string LastUpdatedTrigger_table = null; | |
845 | + string LastUpdatedTrigger_column = ""; | |
846 | + bool LastUpdatedTrigger_removeaction = false; | |
847 | + var manageaction = !forceremoveonly.HasValue; | |
848 | + string actiontext = manageaction ? "MANAGING" : (forceremoveonly.Value ? "REMOVING" : "CREATING"); | |
589 | 849 | ColorConsole.WriteLine(prefix: $" Enter the parameters for {actiontext} LastUpdated trigger.", bracket: "", text: "", f: ConsoleColor.Yellow); |
590 | - string formattext = (manageaction?"[-]":"")+ "[SCHEMA.]TABLE[,COLUMN]"; | |
850 | + string formattext = (manageaction ? "[-]" : "") + "[SCHEMA.]TABLE[,COLUMN]"; | |
591 | 851 | ColorConsole.WriteLine(prefix: $" Format:", bracket: "", text: formattext, f: ConsoleColor.Yellow); |
592 | 852 | |
593 | 853 | ColorConsole.WriteLine(prefix: " ", text: "TABLE", bracket: "", suffix: $": MANDATORY name of the table of the trigger (example:ProductionPeriods)"); |
... | ... | @@ -597,74 +857,90 @@ GO |
597 | 857 | |
598 | 858 | var createtriggerparameters = ColorConsole.ReadLine($"", ConsoleColor.Yellow, suffix: ""); |
599 | 859 | if (createtriggerparameters.ToUpper() == "EX") { return o; } |
600 | - if (string.IsNullOrWhiteSpace(createtriggerparameters)) { goto getparameters; } | |
860 | + if (string.IsNullOrWhiteSpace(createtriggerparameters)) { goto getparametersloop; } | |
601 | 861 | |
602 | 862 | bool removeactionselected = createtriggerparameters.Substring(1) == "-"; |
603 | - bool effectiveremoveaction = manageaction && removeactionselected || !manageaction && forceremoveonly.Value; | |
604 | - string effectiveactiontext = effectiveremoveaction ? "REMOVE" : "CREATE"; | |
605 | - createtriggerparameters = createtriggerparameters.Substring(0,1) == "-" ?createtriggerparameters.Substring(1): createtriggerparameters; | |
863 | + LastUpdatedTrigger_removeaction = manageaction && removeactionselected || !manageaction && forceremoveonly.Value; | |
864 | + createtriggerparameters = createtriggerparameters.Substring(0, 1) == "-" ? createtriggerparameters.Substring(1) : createtriggerparameters; | |
606 | 865 | var optionList = createtriggerparameters.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); |
607 | 866 | |
608 | - string db = sqld.DBName; | |
609 | 867 | string tablewithschema = ""; |
610 | - string column = ""; | |
611 | 868 | if (optionList.Length == 1) { tablewithschema = optionList[0]; } |
612 | - else if (optionList.Length == 2) { tablewithschema = optionList[0]; column = optionList[1]; } | |
613 | - else /*if (optionList.Length > 2)*/ { ColorConsole.WriteLine("ERROR! No more parameters required beside SCHEMA, TABLE and COLUMN!", ConsoleColor.Red); goto getparameters; } | |
869 | + else if (optionList.Length == 2) { tablewithschema = optionList[0]; LastUpdatedTrigger_column = optionList[1]; } | |
870 | + else /*if (optionList.Length > 2)*/ { ColorConsole.WriteLine("ERROR! No more parameters required beside SCHEMA, TABLE and COLUMN!", ConsoleColor.Red); goto getparametersloop; } | |
614 | 871 | |
615 | - if (string.IsNullOrWhiteSpace(column)) column = "LastUpdated"; | |
872 | + if (string.IsNullOrWhiteSpace(LastUpdatedTrigger_column)) LastUpdatedTrigger_column = "LastUpdated"; | |
616 | 873 | |
617 | - if (string.IsNullOrWhiteSpace(db)) { ColorConsole.WriteLine("ERROR! DATABASE can not be empty!", ConsoleColor.Red); goto getparameters; } | |
618 | - if (string.IsNullOrWhiteSpace(tablewithschema)) { ColorConsole.WriteLine("ERROR! [SCHEMA.]TABLE can not be empty!", ConsoleColor.Red); goto getparameters; } | |
874 | + if (string.IsNullOrWhiteSpace(LastUpdatedTrigger_db)) { ColorConsole.WriteLine("ERROR! DATABASE can not be empty!", ConsoleColor.Red); goto getparametersloop; } | |
875 | + if (string.IsNullOrWhiteSpace(tablewithschema)) { ColorConsole.WriteLine("ERROR! [SCHEMA.]TABLE can not be empty!", ConsoleColor.Red); goto getparametersloop; } | |
619 | 876 | var tablewithschemasplitted = tablewithschema.Split('.'); |
620 | - if (tablewithschemasplitted.Length != 1 && tablewithschemasplitted.Length != 2) { ColorConsole.WriteLine("ERROR! [SCHEMA.]TABLE incorrect!", ConsoleColor.Red); goto getparameters; } | |
621 | - if (string.IsNullOrWhiteSpace(column)) { ColorConsole.WriteLine("ERROR! COLUMN can not be empty!", ConsoleColor.Red); goto getparameters; } | |
622 | - | |
623 | - string schema = "dbo"; | |
624 | - string table = tablewithschema; | |
625 | - if (tablewithschemasplitted.Length == 2) { schema = tablewithschemasplitted[0]; table = tablewithschemasplitted[1]; } | |
626 | - string triggername = $"TRG_LASTUPDATETS_{db}_{schema}_{table}_{column}"; | |
627 | - string parameters = $"DBNAME={db};SCHEMA={schema};TABLE={table};COLUMN={column};TRIGGER={triggername};"; | |
628 | - string ssScriptText = null; | |
877 | + if (tablewithschemasplitted.Length != 1 && tablewithschemasplitted.Length != 2) { ColorConsole.WriteLine("ERROR! [SCHEMA.]TABLE incorrect!", ConsoleColor.Red); goto getparametersloop; } | |
878 | + if (string.IsNullOrWhiteSpace(LastUpdatedTrigger_column)) { ColorConsole.WriteLine("ERROR! COLUMN can not be empty!", ConsoleColor.Red); goto getparametersloop; } | |
629 | 879 | |
630 | - string triggerfulldesignation = $"db={db},table={schema}.{table},column={column},trigger={triggername}"; | |
631 | - ColorConsole.WriteLine(prefix: $"Action to execute:{effectiveactiontext}.", text: $" {triggerfulldesignation}.", bracket: "", suffix: $""); | |
632 | - var confirm = ColorConsole.ReadLine($"Enter CONFIRM to confirm, NO to continue.", ConsoleColor.Yellow, suffix: ""); | |
633 | - if (createtriggerparameters.ToUpper() == "EX") { return o; } | |
634 | - if (confirm.ToUpper() != "CONFIRM") { goto getparameters; } | |
880 | + LastUpdatedTrigger_table = tablewithschema; | |
881 | + if (tablewithschemasplitted.Length == 2) { LastUpdatedTrigger_schema = tablewithschemasplitted[0]; LastUpdatedTrigger_table = tablewithschemasplitted[1]; } | |
882 | + | |
883 | + SQLDataBase.LastUpdatedTrigger LastUpdatedTrigger = new SQLDataBase.LastUpdatedTrigger() {Db= LastUpdatedTrigger_db, Schema= LastUpdatedTrigger_schema,Table= LastUpdatedTrigger_table,Column= LastUpdatedTrigger_column , Remove= LastUpdatedTrigger_removeaction ,}; | |
884 | + TriggerToExecuteList.Add(LastUpdatedTrigger); | |
885 | + } | |
635 | 886 | |
636 | - if (!Tools.ResolveArguments(parameters, RemoveLastUpdatedTrigger_Script, out ssScriptText)) { throw new ApplicationException(); } | |
637 | - try {SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, 5000, null); } | |
638 | - catch (Exception e) {ColorConsole.WriteLine(e.MessageNested(), ConsoleColor.Yellow);} | |
639 | - if (!Tools.ResolveArguments(parameters, RemoveLastUpdatedColumn_Script, out ssScriptText)) { throw new ApplicationException(); } | |
640 | - try {SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, 5000, null);} | |
887 | + bool allconfirmed = false; | |
888 | + foreach (var triggertoexecute in TriggerToExecuteList) | |
889 | + { | |
890 | + var retcode = ExecuteOneLastUpdateTrigger(sqld.SQLCS, triggertoexecute, allconfirmed); | |
891 | + if (retcode == "EX") return o; | |
892 | + else if (retcode == "ALL") { allconfirmed = true; } | |
893 | + else if (retcode != null) goto getparametersloop; | |
894 | + } | |
895 | + return o; | |
896 | + } | |
897 | + | |
898 | + private static string ExecuteOneLastUpdateTrigger(string sqlcs,SQLDataBase.LastUpdatedTrigger triggertoexecute, bool allconfirmed) | |
899 | + { | |
900 | + string returntext = null; | |
901 | + try | |
902 | + { | |
903 | + string removeactionText = triggertoexecute.Remove ? "REMOVE" : "CREATE"; | |
904 | + string LastUpdatedTrigger_triggername = $"TRG_LASTUPDATETS_{triggertoexecute.Db}_{triggertoexecute.Schema}_{triggertoexecute.Table}_{triggertoexecute.Column}"; | |
905 | + string LastUpdatedTrigger_fulldesignation = $"db={triggertoexecute.Db},table={triggertoexecute.Schema}.{triggertoexecute.Table},column={triggertoexecute.Column},trigger={LastUpdatedTrigger_triggername}"; | |
906 | + if (!allconfirmed) | |
907 | + { | |
908 | + ColorConsole.WriteLine(); | |
909 | + ColorConsole.WriteLine(prefix: $"Action to execute:{removeactionText}.", text: $" {LastUpdatedTrigger_fulldesignation}.", bracket: "", suffix: $""); | |
910 | + var confirm = ColorConsole.ReadLine($"Enter CONFIRM to confirm, ALL to confirm all, SKIP to continue.", ConsoleColor.Yellow, suffix: ""); | |
911 | + if (confirm.ToUpper() == "EX") { return "EX"; } | |
912 | + else if (confirm.ToUpper() == "CONFIRM") { returntext = null; } | |
913 | + else if (confirm.ToUpper() == "ALL") { returntext = "ALL"; } | |
914 | + else { return null; } | |
915 | + } | |
916 | + | |
917 | + string ssScriptText = null; | |
918 | + string LastUpdatedTrigger_parameters = $"DBNAME={triggertoexecute.Db};SCHEMA={triggertoexecute.Schema};TABLE={triggertoexecute.Table};COLUMN={triggertoexecute.Column};TRIGGER={LastUpdatedTrigger_triggername};"; | |
919 | + if (!Tools.ResolveArguments(LastUpdatedTrigger_parameters, RemoveLastUpdatedTrigger_Script, out ssScriptText)) { throw new ApplicationException(); } | |
920 | + try { SQLDataBaseManagerCore.ExecuteSQLScript(sqlcs, ssScriptText, 5000, null); } | |
921 | + catch (Exception e) { ColorConsole.WriteLine(e.MessageNested(), ConsoleColor.Yellow); } | |
922 | + if (!Tools.ResolveArguments(LastUpdatedTrigger_parameters, RemoveLastUpdatedColumn_Script, out ssScriptText)) { throw new ApplicationException(); } | |
923 | + try { SQLDataBaseManagerCore.ExecuteSQLScript(sqlcs, ssScriptText, 5000, null); } | |
641 | 924 | catch (Exception e) { ColorConsole.WriteLine(e.MessageNested(), ConsoleColor.Yellow); } |
642 | 925 | |
643 | - if (!effectiveremoveaction) | |
926 | + if (!triggertoexecute.Remove) | |
644 | 927 | { |
645 | - if (!Tools.ResolveArguments(parameters, CreateLastUpdatedColumn_Script, out ssScriptText)) { throw new ApplicationException(); } | |
646 | - SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, 5000, null); | |
928 | + if (!Tools.ResolveArguments(LastUpdatedTrigger_parameters, CreateLastUpdatedColumn_Script, out ssScriptText)) { throw new ApplicationException(); } | |
929 | + SQLDataBaseManagerCore.ExecuteSQLScript(sqlcs, ssScriptText, 5000, null); | |
647 | 930 | |
648 | - if (!Tools.ResolveArguments(parameters, CreateLastUpdatedTrigger_Script, out ssScriptText)) { throw new ApplicationException(); } | |
649 | - SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, 5000, null); | |
931 | + if (!Tools.ResolveArguments(LastUpdatedTrigger_parameters, CreateLastUpdatedTrigger_Script, out ssScriptText)) { throw new ApplicationException(); } | |
932 | + SQLDataBaseManagerCore.ExecuteSQLScript(sqlcs, ssScriptText, 5000, null); | |
650 | 933 | |
651 | - if (!Tools.ResolveArguments(parameters, EnableLastUpdatedTrigger_Script, out ssScriptText)) { throw new ApplicationException(); } | |
652 | - SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, 5000, null); | |
934 | + if (!Tools.ResolveArguments(LastUpdatedTrigger_parameters, EnableLastUpdatedTrigger_Script, out ssScriptText)) { throw new ApplicationException(); } | |
935 | + SQLDataBaseManagerCore.ExecuteSQLScript(sqlcs, ssScriptText, 5000, null); | |
653 | 936 | } |
654 | - ColorConsole.WriteLine($"SUCCESS! {effectiveactiontext} trigger to store LastUpdate TimeStamp: {triggerfulldesignation}", ConsoleColor.Green); | |
655 | - goto getparameters; | |
656 | - } | |
657 | - catch (ApplicationException e) | |
658 | - { | |
659 | - ColorConsole.WriteLine("FATAL ERROR! in script parameter substitution!", ConsoleColor.Red); | |
660 | - goto getparameters; | |
661 | - } | |
662 | - catch (Exception e) | |
663 | - { | |
664 | - ColorConsole.WriteLine("FATAL ERROR! "+e.MessageNested(), ConsoleColor.Red); | |
665 | - goto getparameters; | |
937 | + ColorConsole.WriteLine($"SUCCESS! {removeactionText} trigger to store LastUpdate TimeStamp: {LastUpdatedTrigger_fulldesignation}", ConsoleColor.Green); | |
666 | 938 | } |
939 | + catch (ApplicationException e) { ColorConsole.WriteLine("FATAL ERROR! in script parameter substitution!", ConsoleColor.Red); returntext = null; } | |
940 | + catch (Exception e) { ColorConsole.WriteLine("FATAL ERROR! " + e.MessageNested(), ConsoleColor.Red); returntext = null; } | |
941 | + return returntext; | |
667 | 942 | } |
943 | + #endregion ManageLastUpdatedTrigger | |
668 | 944 | |
669 | 945 | private static object ExecuteScript(object parameter, object o) |
670 | 946 | { |
... | ... | @@ -728,8 +1004,7 @@ GO |
728 | 1004 | } |
729 | 1005 | return o; |
730 | 1006 | } |
731 | - | |
732 | - private static object DropDB(object parameter, object o) | |
1007 | + private static object DropDB(object parameter, object o) | |
733 | 1008 | { |
734 | 1009 | var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); |
735 | 1010 | var args = (parameter as Menu.ExecutorParameter).Args; |
... | ... | @@ -1273,7 +1548,7 @@ GO |
1273 | 1548 | |
1274 | 1549 | string createUserQuery = "CREATE USER [" + dbusername + "]"; |
1275 | 1550 | if (forlogin.HasValue && forlogin.Value) {createUserQuery += " FOR LOGIN [" + loginname + "];"; } |
1276 | - else if (forlogin.HasValue && !forlogin.Value) { createUserQuery = " WITHOUT LOGIN;"; } | |
1551 | + else if (forlogin.HasValue && !forlogin.Value) { createUserQuery += " WITHOUT LOGIN;"; } | |
1277 | 1552 | createUserQuery += ";"; |
1278 | 1553 | |
1279 | 1554 | using (SqlCommand createUserCommand = new SqlCommand(createUserQuery, connection)) { createUserCommand.ExecuteNonQuery(); } |
... | ... | @@ -1968,6 +2243,9 @@ GO |
1968 | 2243 | public string Xml_PhysicalFilesDirectoryPath; |
1969 | 2244 | public int Xml_ScriptCommandTimeout; |
1970 | 2245 | public List<SQLData> Xml_SQLDataList; |
2246 | + public List<LastUpdatedTrigger> Xml_SQLLastUpdatedTriggerList; | |
2247 | + public List<DBUser> Xml_SQLDbUserList; | |
2248 | + public List<ServerLogin> Xml_SQLServerLoginList; | |
1971 | 2249 | public List<SQLScript> Xml_SQLScriptList; |
1972 | 2250 | |
1973 | 2251 | public string DBName; |
... | ... | @@ -2082,6 +2360,21 @@ GO |
2082 | 2360 | var sqldataXmlList = GetAllXElements(sqldatabasexml, nameof(XmlStructure.SQLDataBase.SQLData)); |
2083 | 2361 | if (sqldataXmlList!=null) { foreach (var sqldataXml in sqldataXmlList) { Xml_SQLDataList.Add(new SQLData(sqldataXml)); } } |
2084 | 2362 | |
2363 | + Xml_SQLLastUpdatedTriggerList = new List<LastUpdatedTrigger>(); | |
2364 | + var trgsXml = GetXElement(sqldatabasexml, nameof(XmlStructure.SQLDataBase.Triggers)); | |
2365 | + var trgXmlList = GetAllXElements(trgsXml, nameof(XmlStructure.SQLDataBase.Triggers.LastUpdatedTrigger)); | |
2366 | + if (trgXmlList != null) { int ix = 0; foreach (var trgXml in trgXmlList) { Xml_SQLLastUpdatedTriggerList.Add(new LastUpdatedTrigger(trgXml,ix)); ix++; } } | |
2367 | + | |
2368 | + Xml_SQLDbUserList = new List<DBUser>(); | |
2369 | + var dbusersXml = GetXElement(sqldatabasexml, nameof(XmlStructure.SQLDataBase.DBUsers)); | |
2370 | + var dbuserXmlList = GetAllXElements(dbusersXml, nameof(XmlStructure.SQLDataBase.DBUsers.DBUser)); | |
2371 | + if (dbuserXmlList != null) { int ix = 0; foreach (var dbusrXml in dbuserXmlList) { Xml_SQLDbUserList.Add(new DBUser(dbusrXml, ix)); ix++; } } | |
2372 | + | |
2373 | + Xml_SQLServerLoginList = new List<ServerLogin>(); | |
2374 | + var srvrloginsXml = GetXElement(sqldatabasexml, nameof(XmlStructure.SQLDataBase.ServerLogins)); | |
2375 | + var srvrloginXmlList = GetAllXElements(srvrloginsXml, nameof(XmlStructure.SQLDataBase.ServerLogins.ServerLogin)); | |
2376 | + if (srvrloginXmlList != null) { int ix = 0; foreach (var srvrloginXml in srvrloginXmlList) { Xml_SQLServerLoginList.Add(new ServerLogin(srvrloginXml, ix)); ix++; } } | |
2377 | + | |
2085 | 2378 | Xml_SQLScriptList = new List<SQLScript>(); |
2086 | 2379 | var sqlscriptsXml = GetXElement(sqldatabasexml, nameof(XmlStructure.SQLDataBase.Scripts)); |
2087 | 2380 | var sqlscriptXmlList = GetAllXElements(sqlscriptsXml, nameof(XmlStructure.SQLDataBase.Scripts.Script)); |
... | ... | @@ -2143,6 +2436,44 @@ GO |
2143 | 2436 | public static class Group { public static class Values { public const string DEFAULT = ""; } } |
2144 | 2437 | } |
2145 | 2438 | } |
2439 | + public static class Triggers | |
2440 | + { | |
2441 | + public static class LastUpdatedTrigger | |
2442 | + { | |
2443 | + public static class Attributes | |
2444 | + { | |
2445 | + public static class Schema { public static class Values { public const string DEFAULT = ""; } } | |
2446 | + public static class Table { public static class Values { public const string DEFAULT = ""; } } | |
2447 | + public static class Field { public static class Values { public const string DEFAULT = ""; } } | |
2448 | + } | |
2449 | + } | |
2450 | + } | |
2451 | + public static class DBUsers | |
2452 | + { | |
2453 | + public static class DBUser | |
2454 | + { | |
2455 | + public static class Attributes | |
2456 | + { | |
2457 | + public static class UserName { public static class Values { public const string DEFAULT = ""; } } | |
2458 | + public static class RoleNameList { public static class Values { public const string DEFAULT = ""; } } | |
2459 | + public static class LoginName { public static class Values { public const string DEFAULT = ""; } } | |
2460 | + } | |
2461 | + } | |
2462 | + } | |
2463 | + public static class ServerLogins | |
2464 | + { | |
2465 | + public static class ServerLogin | |
2466 | + { | |
2467 | + public static class Attributes | |
2468 | + { | |
2469 | + public static class LoginName { public static class Values { public const string DEFAULT = ""; } } | |
2470 | + public static class LoginPassword { public static class Values { public const string DEFAULT = ""; } } | |
2471 | + public static class GrantorLoginName { public static class Values { public const string DEFAULT = ""; } } | |
2472 | + public static class GrantorLoginPsw { public static class Values { public const string DEFAULT = ""; } } | |
2473 | + public static class DefaultDatabase{ public static class Values { public const string DEFAULT = ""; } } | |
2474 | + } | |
2475 | + } | |
2476 | + } | |
2146 | 2477 | public static class Scripts |
2147 | 2478 | { |
2148 | 2479 | public static class Script |
... | ... | @@ -2233,6 +2564,83 @@ GO |
2233 | 2564 | #endregion constructors |
2234 | 2565 | } |
2235 | 2566 | #endregion SQLData class |
2567 | + #region LastUpdatedTrigger class | |
2568 | + public class LastUpdatedTrigger : XmlLinqBase | |
2569 | + { | |
2570 | + #region fields | |
2571 | + public string Key = ""; | |
2572 | + public string Db = ""; | |
2573 | + public string Schema = ""; | |
2574 | + public string Table = ""; | |
2575 | + public string Column= ""; | |
2576 | + public bool Remove = false; | |
2577 | + #endregion fields | |
2578 | + #region constructors | |
2579 | + public LastUpdatedTrigger() { } | |
2580 | + public LastUpdatedTrigger(LastUpdatedTrigger dbusr) { Schema = dbusr.Schema; Column = dbusr.Column; Table = dbusr.Table; Key = dbusr.Key; Db = dbusr.Db; Remove = dbusr.Remove;} | |
2581 | + public LastUpdatedTrigger(XElement trgXml, int ix) | |
2582 | + { | |
2583 | + Key = $"TRG{ix}"; | |
2584 | + Schema = GetValue(nameof(XmlStructure.SQLDataBase.Triggers.LastUpdatedTrigger.Attributes.Schema), trgXml, XmlStructure.SQLDataBase.Triggers.LastUpdatedTrigger.Attributes.Schema.Values.DEFAULT); | |
2585 | + Table = GetValue(nameof(XmlStructure.SQLDataBase.Triggers.LastUpdatedTrigger.Attributes.Table), trgXml, XmlStructure.SQLDataBase.Triggers.LastUpdatedTrigger.Attributes.Table.Values.DEFAULT); | |
2586 | + Column = GetValue(nameof(XmlStructure.SQLDataBase.Triggers.LastUpdatedTrigger.Attributes.Field), trgXml, XmlStructure.SQLDataBase.Triggers.LastUpdatedTrigger.Attributes.Field.Values.DEFAULT); | |
2587 | + } | |
2588 | + #endregion constructors | |
2589 | + } | |
2590 | + #endregion LastUpdatedTrigger class | |
2591 | + #region DBUser class | |
2592 | + public class DBUser : XmlLinqBase | |
2593 | + { | |
2594 | + #region fields | |
2595 | + public string Key = ""; | |
2596 | + public string Db = ""; | |
2597 | + public string UserName = ""; | |
2598 | + public string LoginName = ""; | |
2599 | + public string RoleNameCommaList = ""; | |
2600 | + public bool Remove = false; | |
2601 | + #endregion fields | |
2602 | + #region constructors | |
2603 | + public DBUser() { } | |
2604 | + public DBUser(DBUser dbusr) { UserName = dbusr.UserName; LoginName = dbusr.LoginName; RoleNameCommaList = dbusr.RoleNameCommaList; Key = dbusr.Key; Db = dbusr.Db; Remove = dbusr.Remove; } | |
2605 | + public DBUser(XElement dbusrXml, int ix) | |
2606 | + { | |
2607 | + Key = $"DBU{ix}"; | |
2608 | + UserName = GetValue(nameof(XmlStructure.SQLDataBase.DBUsers.DBUser.Attributes.UserName), dbusrXml, XmlStructure.SQLDataBase.DBUsers.DBUser.Attributes.UserName.Values.DEFAULT); | |
2609 | + RoleNameCommaList = GetValue(nameof(XmlStructure.SQLDataBase.DBUsers.DBUser.Attributes.RoleNameList), dbusrXml, XmlStructure.SQLDataBase.DBUsers.DBUser.Attributes.RoleNameList.Values.DEFAULT); | |
2610 | + LoginName = GetValue(nameof(XmlStructure.SQLDataBase.DBUsers.DBUser.Attributes.LoginName), dbusrXml, XmlStructure.SQLDataBase.DBUsers.DBUser.Attributes.LoginName.Values.DEFAULT); | |
2611 | + } | |
2612 | + #endregion constructors | |
2613 | + } | |
2614 | + #endregion DBUser class | |
2615 | + #region ServerLogin class | |
2616 | + public class ServerLogin : XmlLinqBase | |
2617 | + { | |
2618 | + #region fields | |
2619 | + public string Key = ""; | |
2620 | + public string Db = ""; | |
2621 | + public string GrantorUserLoginName = ""; | |
2622 | + public string LoginName = ""; | |
2623 | + public string LoginPassword = ""; | |
2624 | + public LoginType LoginType = LoginType.WindowsUser; | |
2625 | + public string GrantorUserLoginPassword = ""; | |
2626 | + public string DefaultDatabase = ""; | |
2627 | + public bool Remove = false; | |
2628 | + #endregion fields | |
2629 | + #region constructors | |
2630 | + public ServerLogin() { } | |
2631 | + public ServerLogin(ServerLogin srvrlogin) { LoginName = srvrlogin.LoginName; GrantorUserLoginName = srvrlogin.GrantorUserLoginName; LoginPassword = srvrlogin.LoginPassword; GrantorUserLoginPassword = srvrlogin.GrantorUserLoginPassword; Key = srvrlogin.Key; Db = srvrlogin.Db; Remove = srvrlogin.Remove; } | |
2632 | + public ServerLogin(XElement dbusrXml, int ix) | |
2633 | + { | |
2634 | + Key = $"SL{ix}"; | |
2635 | + LoginName = GetValue(nameof(XmlStructure.SQLDataBase.ServerLogins.ServerLogin.Attributes.LoginName), dbusrXml, XmlStructure.SQLDataBase.ServerLogins.ServerLogin.Attributes.LoginName.Values.DEFAULT); | |
2636 | + LoginPassword = GetValue(nameof(XmlStructure.SQLDataBase.ServerLogins.ServerLogin.Attributes.LoginPassword), dbusrXml, XmlStructure.SQLDataBase.ServerLogins.ServerLogin.Attributes.LoginPassword.Values.DEFAULT); | |
2637 | + GrantorUserLoginName = GetValue(nameof(XmlStructure.SQLDataBase.ServerLogins.ServerLogin.Attributes.GrantorLoginName), dbusrXml, XmlStructure.SQLDataBase.ServerLogins.ServerLogin.Attributes.GrantorLoginName.Values.DEFAULT); | |
2638 | + GrantorUserLoginPassword = GetValue(nameof(XmlStructure.SQLDataBase.ServerLogins.ServerLogin.Attributes.GrantorLoginPsw), dbusrXml, XmlStructure.SQLDataBase.ServerLogins.ServerLogin.Attributes.GrantorLoginPsw.Values.DEFAULT); | |
2639 | + DefaultDatabase = GetValue(nameof(XmlStructure.SQLDataBase.ServerLogins.ServerLogin.Attributes.DefaultDatabase), dbusrXml, XmlStructure.SQLDataBase.ServerLogins.ServerLogin.Attributes.DefaultDatabase.Values.DEFAULT); | |
2640 | + } | |
2641 | + #endregion constructors | |
2642 | + } | |
2643 | + #endregion ServerLogin class | |
2236 | 2644 | } |
2237 | 2645 | #endregion SQLDataBase class |
2238 | 2646 | ... | ... |
Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs
... | ... | @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; |
32 | 32 | // You can specify all the values or you can default the Build and Revision Numbers |
33 | 33 | // by using the '*' as shown below: |
34 | 34 | // [assembly: AssemblyVersion("1.0.*")] |
35 | -[assembly: AssemblyVersion("1.28.1.0")] | |
36 | -[assembly: AssemblyFileVersion("1.28.1.0")] | |
35 | +[assembly: AssemblyVersion("1.29.0.0")] | |
36 | +[assembly: AssemblyFileVersion("1.29.0.0")] | ... | ... |