4f885e7e-d8bb-427c-a54e-8e3e1c3137a7 true IOAK-SQL-LOG-01.sdt.local jazz log prod true <ProgramFilesX64>\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll Newtonsoft.Json Newtonsoft.Json.Converters Newtonsoft.Json.Linq Newtonsoft.Json.Schema Newtonsoft.Json.Serialization System System.Diagnostics System.Diagnostics.Tracing System.Dynamic System.IO.Compression System.Threading.Tasks System.Data.Common #region *** Enumerations *** public enum QueryRegions { Production, Training, Oak, Dev } #endregion #region *** Options *** public static QueryRegions queryRegion = QueryRegions.Production; public static int timeoutInMinutes = 2; #endregion #region *** Database Selection *** public static string[] appVersions = { // This is a list of appVersions to filter for in the database list }; public static string[] serverExclusions = { // This is a list of servers to exclude from the database list @"paonsql19.sdt.local\instance1", @"paonsql17.sdt.local\instance1", @"p0555-sql-01.sdt.local\instance1", "P0000-sql-01.sdt.local", "P9900-SQL-03.sdt.local", "P9900-sql-05.sdt.local" }; public static string[] dbExclusions = { // This is a list of database physical names to exclude from the database list }; public static string[] targetOrgPins = { // This is a list of org pins to target in the database list }; public static string[] targetServers = { // This is a list of servers to target in the database list }; public static string[] targetDBs = { // This is a list of database physicial names to target in the database list }; #endregion *** Options *** #region *** SMC Settings and queries *** public static string smcSql => @"SELECT di.ServerName, di.DatabaseGUID, di.DatabaseName, di.PhysicalName, di.OrgPin, di.AppVersion, di.Description FROM [dbo].[viewDatabaseInfo] di WHERE 1=1" + (queryRegion == QueryRegions.Dev ? @" AND di.PhysicalName like 'jazz%'" : $@" AND di.PhysicalName like 'jazz {(queryRegion != QueryRegions.Production ? "tst" : "prd")}%' AND di.ServerName like 'p%'"); public static string smcServer { get; set; } public static string smcDB { get; set; } #endregion #region *** Program variables and settings *** public static IOrderedEnumerable databases => GetDatabases(); #endregion void Main() { //databases.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName).Dump($"{queryRegion} {nameof(databases)}"); var workList = databases.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName).ToList(); var sqlQuery = @"select Name, t.Time, RepeatType, IsDisabled, HasRun, LastSubmittedDate, LastRunDate from TEScheduledTask t where name = 'Starter Set Report Card Validator'"; var start = new DateTime(2020, 3, 23, 3, 0, 0); var interval = 3; // minutes workList.ForEach(db => { try { var connectionString = BuildConnectionString(db.Server, db.PhysicalName); var database = new Database(); var results = SelectDynamic(database, connectionString, sqlQuery); if (results.Any()) { //var updateStatement = $@"Update TEScheduledTask set Time = '{start.ToString("hh:mm:ss tt")}' where name = 'Starter Set Report Card Validator'"; //ExecuteCommand(database, connectionString, updateStatement); //var after = SelectDynamic(database, connectionString, sqlQuery); new { connectionString, //updateStatement, results//, //after }.Dump(); start = start.AddMinutes(interval); } } catch (SqlException sqlEx) { sqlEx.Dump(); return; } }); } public class Database { public string Server { get; set; } public Guid DatabaseGuid { get; set; } public string DatabaseName { get; set; } public string PhysicalName { get; set; } public string OrgPin { get; set; } public string AppVersion { get; set; } public string Description { get; set; } public Dictionary Fields { get; set; } public Database() { } public Database(DataRow dr) { Server = dr.Field("ServerName"); DatabaseGuid = dr.Field("DatabaseGuid"); DatabaseName = dr.Field("DatabaseName"); PhysicalName = dr.Field("PhysicalName"); OrgPin = dr.Field("OrgPin"); AppVersion = dr.Field("AppVersion"); Description = dr.Field("Description"); Fields = new Dictionary(); foreach (DataColumn column in dr.Table.Columns) { var index = dr.Table.Columns.IndexOf(column); Fields.Add(column.ColumnName, dr[index].ToString()); } } object ToDump() => (object)new { Server, DatabaseGuid, DatabaseName, PhysicalName, OrgPin, AppVersion, Description }; } public static IOrderedEnumerable GetDatabases() { switch (queryRegion) { case QueryRegions.Production: smcServer = "ioak-sql-smc-01"; smcDB = "smc prod"; break; case QueryRegions.Training: smcServer = "ioak-sql-smc-01"; smcDB = "smc training"; break; case QueryRegions.Oak: smcServer = "ioak-sql-smc-01.sdt.local"; smcDB = "smc qa"; break; default: smcServer = "DDEN-SQL-SMC-01.sdt.local"; smcDB = "smc dev"; break; } List databases = new List(); var connStr = BuildConnectionString(smcServer, smcDB); using (var conn = new SqlConnection(connStr)) { var command = new SqlCommand(smcSql, conn); command.CommandType = CommandType.Text; var database = new DataSet(); conn.Open(); using (DbDataReader reader = command.ExecuteReader()) { while (true) { var table = new DataTable(); database.Tables.Add(table); table.Load(reader); if (reader.IsClosed || !reader.NextResult()) break; } } conn.Close(); databases = database.Tables[0].AsEnumerable().Select(dr => new Database(dr)).ToList(); databases = databases.Where(dr => !dbExclusions.Contains(dr.PhysicalName) && !serverExclusions.Contains(dr.Server)).ToList(); if (targetOrgPins.Any()) databases = databases.Where(dr => targetOrgPins.Contains(dr.OrgPin)).ToList(); if (targetServers.Any()) databases = databases.Where(dr => targetServers.Contains(dr.Server)).ToList(); if (targetDBs.Any()) databases = databases.Where(dr => targetDBs.Contains(dr.PhysicalName)).ToList(); if (appVersions.Any()) databases = databases.Where(dr => appVersions.Contains(dr.AppVersion)).ToList(); } return databases .OrderBy(d => d.Server).ThenBy(d => d.PhysicalName); } public static void ExecuteCommand(Database db, string connStr, string sql) { using (var conn = new SqlConnection(connStr)) { var command = new SqlCommand(sql, conn); command.CommandType = CommandType.Text; command.CommandTimeout = (int)TimeSpan.FromMinutes(timeoutInMinutes).TotalSeconds; conn.Open(); try { command.ExecuteNonQuery(); conn.Close(); } catch (SqlException sqlEx) { sqlEx.Dump(); } } } public static IEnumerable SelectDynamic(Database db, string connStr, string sql) { using (var conn = new SqlConnection(connStr)) { var command = new SqlCommand(sql, conn); command.CommandType = CommandType.Text; command.CommandTimeout = (int)TimeSpan.FromMinutes(timeoutInMinutes).TotalSeconds; var database = new DataSet(); conn.Open(); using (DbDataReader reader = command.ExecuteReader()) { while (true) { var names = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList(); foreach (IDataRecord record in reader as IEnumerable) { var expando = new ExpandoObject() as IDictionary; foreach (var name in names) expando[name] = record[name]; yield return expando; } if (reader.IsClosed || !reader.NextResult()) break; } } conn.Close(); } } public static string BuildConnectionString(string server, string database, string username = null, string password = null) { return username == null ? $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;" : $"data source={server};initial catalog='{database}';User ID={username};pwd={password}"; }