Files
linqpad/Update TEScheduleTask for Starter Set Report Card Validator.linq
T

281 lines
8.3 KiB
C#

<Query Kind="Program">
<Connection>
<ID>4f885e7e-d8bb-427c-a54e-8e3e1c3137a7</ID>
<Persist>true</Persist>
<Server>IOAK-SQL-LOG-01.sdt.local</Server>
<Database>jazz log prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Dynamic</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
<Namespace>System.Data.Common</Namespace>
</Query>
#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<Database> 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<string, string> Fields { get; set; }
public Database()
{
}
public Database(DataRow dr)
{
Server = dr.Field<string>("ServerName");
DatabaseGuid = dr.Field<Guid>("DatabaseGuid");
DatabaseName = dr.Field<string>("DatabaseName");
PhysicalName = dr.Field<string>("PhysicalName");
OrgPin = dr.Field<string>("OrgPin");
AppVersion = dr.Field<string>("AppVersion");
Description = dr.Field<string>("Description");
Fields = new Dictionary<string, string>();
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<Database> 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<Database> databases = new List<UserQuery.Database>();
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<dynamic> 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<string, object>;
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}";
}