281 lines
8.3 KiB
C#
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><ProgramFilesX64>\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}";
|
|
}
|