SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒฏแƒ”แƒœแƒ™แƒ˜แƒœแƒกแƒจแƒ˜: แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒก แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒ˜แƒกแƒ”แƒ• แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒก แƒ—แƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ‘แƒ Zero Touch PROD RDS-แƒ˜แƒก แƒฅแƒ•แƒ”แƒจ. แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ DBA-แƒ”แƒ‘แƒ˜ แƒ•แƒ”แƒ  แƒจแƒ”แƒซแƒšแƒ”แƒ‘แƒ”แƒœ แƒฃแƒจแƒฃแƒแƒšแƒแƒ“ PROD แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒแƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒจแƒ”แƒซแƒšแƒ”แƒ‘แƒ”แƒœ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒก Jenkins แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒ”แƒ‘แƒ˜ แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒฃแƒšแƒ˜ แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. DBA แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒก แƒ“แƒ แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒ“แƒ แƒแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ˜แƒฆแƒ”แƒ‘แƒก แƒฌแƒ”แƒ แƒ˜แƒšแƒก แƒแƒ› แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒแƒ› แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฌแƒแƒ แƒ“แƒ’แƒ”แƒœแƒ˜แƒก แƒ’แƒ–แƒ”แƒ‘แƒก.

SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒฏแƒ”แƒœแƒ™แƒ˜แƒœแƒกแƒจแƒ˜: แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒก แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒขแƒ”แƒฅแƒกแƒขแƒฃแƒ แƒ˜

แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒขแƒ แƒ˜แƒ•แƒ˜แƒแƒšแƒฃแƒ แƒ˜แƒ—. แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ˜แƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ, แƒ แƒแƒ› แƒกแƒแƒšแƒแƒžแƒแƒ แƒแƒ™แƒ แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒแƒ แƒแƒคแƒ”แƒ แƒ˜แƒ (แƒแƒ•แƒขแƒแƒ แƒ˜ แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒจแƒ˜ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก FreeStyle แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒ”แƒ‘แƒก):

SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒฏแƒ”แƒœแƒ™แƒ˜แƒœแƒกแƒจแƒ˜: แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒก แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

sqlcmd แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒ แƒแƒฆแƒแƒชแƒแƒก แƒ“แƒ แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒก แƒฌแƒแƒ แƒ•แƒฃแƒ“แƒ’แƒ”แƒœแƒ— แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒก. แƒ˜แƒ“แƒ”แƒแƒšแƒฃแƒ แƒ˜แƒ, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก:

SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒฏแƒ”แƒœแƒ™แƒ˜แƒœแƒกแƒจแƒ˜: แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒก แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒแƒ  แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ—, แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, แƒ แƒแƒ› RDS-แƒ˜แƒก แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ/แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ˜แƒก แƒฅแƒ•แƒ”แƒจ แƒแƒ แƒ˜แƒก แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜, แƒแƒกแƒ” แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ”แƒšแƒแƒ“แƒแƒ— แƒ›แƒแƒก:

declare @rds table
  (id int, task_type varchar(128), database_name sysname, pct int, duration int, 
   lifecycle varchar(128), taskinfo varchar(max) null, 
   upd datetime, cre datetime,
   s3 varchar(256), ovr int, KMS varchar(256) null)
waitfor delay '00:00:20' 
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}'
select @xid=max(id) from @rds

again:
waitfor delay '00:00:02'
delete from @rds
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}' 
# {db} substituted with db name by powershell
select @stat=lifecycle,@info=taskinfo from @rds where id=@xid
if @stat not in ('ERROR','SUCCESS','CANCELLED') goto again

แƒ›แƒ”แƒแƒ แƒ” แƒ›แƒ”แƒ—แƒแƒ“แƒ˜, CSV

แƒแƒฅ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ:

SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒฏแƒ”แƒœแƒ™แƒ˜แƒœแƒกแƒจแƒ˜: แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒก แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒ—แƒฃแƒ›แƒชแƒ, แƒ”แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ˜แƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ—แƒฃ CSV-แƒจแƒ˜ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก โ€žแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜โ€œ. แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒ— แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒแƒ—, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, TOP N CPU แƒ˜แƒœแƒขแƒ”แƒœแƒกแƒ˜แƒฃแƒ แƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ แƒแƒ› แƒ’แƒ–แƒ˜แƒ—, CSV "แƒ™แƒแƒ แƒแƒ–แƒ˜แƒ แƒ“แƒ”แƒ‘แƒ" แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒ แƒแƒ› แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒขแƒ”แƒฅแƒกแƒขแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒ“แƒ”แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒก - แƒ›แƒซแƒ˜แƒ›แƒ”แƒ”แƒ‘แƒก, แƒชแƒ˜แƒขแƒแƒขแƒ”แƒ‘แƒก แƒ“แƒ แƒฎแƒแƒ–แƒ”แƒ‘แƒ˜แƒก แƒฌแƒงแƒ•แƒ”แƒขแƒ”แƒ‘แƒกแƒแƒช แƒ™แƒ˜. แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ แƒแƒฆแƒแƒช แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜.

แƒšแƒแƒ›แƒแƒ–แƒ˜ แƒœแƒ˜แƒจแƒœแƒ”แƒ‘แƒ˜ HTML-แƒจแƒ˜

แƒ›แƒ” แƒ›แƒแƒจแƒ˜แƒœแƒ•แƒ” แƒ›แƒแƒ’แƒชแƒ”แƒ›แƒ— แƒ™แƒแƒ“แƒ˜แƒก แƒคแƒ แƒแƒ’แƒ›แƒ”แƒœแƒขแƒก

$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@
  
$Result = invoke-Sqlcmd -ConnectionString $jstr -Query "select * from DbInv" `
  | Select-Object -Property * -ExcludeProperty "ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result -eq $null) { $cnt = 0; }
elseif ($Result.getType().FullName -eq "System.Management.Automation.PSCustomObject") { $cnt = 1; }
else { $cnt = $Result.Rows.Count; } 
if ($cnt -gt 0) {
  $body = "<h2>My table</h2>"
  $Result | ConvertTo-HTML -Title "Rows" -Head $header -body $body `
    | Out-File "res.log" -Append -Encoding UTF8
  } else {
    "<h3>No data</h3>" | Out-File "res.log" -Append -Encoding UTF8
  }

แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ แƒ›แƒ˜แƒแƒฅแƒชแƒ˜แƒ”แƒ— System.Management.Automation.PSCustomObject-แƒ˜แƒก แƒฎแƒแƒ–แƒก, แƒ”แƒก แƒฏแƒแƒ“แƒแƒกแƒœแƒฃแƒ แƒ˜แƒ; แƒ—แƒฃ แƒฅแƒกแƒ”แƒšแƒจแƒ˜ แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒฎแƒแƒ–แƒ˜แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒฌแƒแƒ แƒ›แƒแƒ˜แƒจแƒ•แƒ แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜. แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜ แƒแƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒ“แƒแƒœ แƒ“แƒ˜แƒ“แƒ˜ แƒ’แƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒคแƒแƒ แƒ›แƒแƒขแƒ˜แƒ แƒ”แƒ‘แƒแƒก, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ:

SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒฏแƒ”แƒœแƒ™แƒ˜แƒœแƒกแƒจแƒ˜: แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒก แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฎแƒแƒขแƒ•แƒ

แƒ’แƒแƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒ”แƒ‘แƒ: แƒ™แƒ˜แƒœแƒ™แƒ˜ แƒ™แƒแƒ“แƒ˜ แƒฅแƒ•แƒ”แƒ›แƒแƒ—!
แƒแƒ แƒ˜แƒก แƒกแƒแƒกแƒแƒชแƒ˜แƒšแƒ แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒก CPU-แƒก แƒ‘แƒแƒšแƒ N แƒฌแƒฃแƒ—แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜ - แƒ—แƒฃแƒ แƒ›แƒ” แƒแƒ›แƒฎแƒแƒœแƒแƒ’ แƒ›แƒแƒ˜แƒแƒ แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒแƒฎแƒกแƒแƒ•แƒก! แƒกแƒชแƒแƒ“แƒ”แƒ— แƒ”แƒก แƒ•แƒ˜แƒฅแƒขแƒแƒ แƒ˜แƒœแƒ:

DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) 
  FROM sys.dm_os_sys_info WITH (NOLOCK)); 
SELECT TOP(256) 
  DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [EventTime],
  SQLProcessUtilization AS [SQLCPU], 
  100 - SystemIdle - SQLProcessUtilization AS [OtherCPU]
FROM (SELECT record.value('(./Record/@id)[1]', 'int') AS record_id, 
  record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') 
    AS [SystemIdle], 
  record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') 
    AS [SQLProcessUtilization], [timestamp] 
  FROM (SELECT [timestamp], CONVERT(xml, record) AS [record] 
  FROM sys.dm_os_ring_buffers WITH (NOLOCK)
  WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' 
    AND record LIKE N'%<SystemHealth>%') AS x) AS y 
ORDER BY 1 DESC OPTION (RECOMPILE);

แƒแƒฎแƒšแƒ, แƒแƒ› แƒคแƒแƒ แƒ›แƒแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— ($Fragment แƒชแƒ•แƒšแƒแƒ“แƒ˜)

<table style="width: 100%"><tbody><tr style="background-color: white; height: 2pt;">
  <td style="width: SQLCPU%; background-color: green;"></td>
  <td style="width: OtherCPU%; background-color: blue;"></td>
  <td style="width: REST%; background-color: #C0C0C0;"></td></tr></tbody>
</table>

แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒแƒกแƒแƒก แƒกแƒฎแƒ”แƒฃแƒšแƒ˜:

$Result = invoke-Sqlcmd -ConnectionString $connstr -Query $Query `
  | Select-Object -Property * -ExcludeProperty `
  "ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result.HasRows) {
  foreach($item in $Result) 
    { 
    $time = $itemEventTime 
    $sqlcpu = $item.SQLCPU
    $other = $itemOtherCPU
    $rest = 100 - $sqlcpu - $other
    $f = $fragment -replace "SQLCPU", $sqlcpu
    $f = $f -replace "OtherCPU", $other
    $f = $f -replace "REST", $rest
    $f | Out-File "res.log" -Append -Encoding UTF8
    }

แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒฏแƒ”แƒœแƒ™แƒ˜แƒœแƒกแƒจแƒ˜: แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒก แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒ“แƒ˜แƒแƒฎ, แƒ‘แƒแƒขแƒแƒœแƒ›แƒ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ แƒแƒ› แƒ˜แƒชแƒ˜แƒก แƒ’แƒแƒ แƒงแƒ•แƒœแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘! แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ, แƒ แƒแƒ› แƒ”แƒก แƒ™แƒแƒ“แƒ˜ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก: Powershell (แƒ›แƒแƒกแƒจแƒ˜ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜), SQL, Xquery, HTML. แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ, แƒ แƒแƒ› Javascript-แƒก แƒ•แƒ”แƒ  แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— HTML-แƒจแƒ˜ (แƒ แƒแƒ“แƒ’แƒแƒœ แƒ˜แƒก แƒฌแƒ”แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒกแƒแƒ), แƒ›แƒแƒ’แƒ แƒแƒ› Python แƒ™แƒแƒ“แƒ˜แƒก (แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ SQL-แƒจแƒ˜) แƒ’แƒแƒžแƒ แƒ˜แƒแƒšแƒ”แƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒแƒก แƒ›แƒแƒ•แƒแƒšแƒ”แƒแƒ‘แƒแƒ!

SQL profiler แƒ™แƒ•แƒแƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜

แƒœแƒแƒ—แƒ”แƒšแƒ˜แƒ, แƒ แƒแƒ› แƒ™แƒ•แƒแƒšแƒ˜ แƒแƒ  แƒฏแƒ“แƒ”แƒ‘แƒ CSV-แƒจแƒ˜ TextData แƒ•แƒ”แƒšแƒ˜แƒก แƒ’แƒแƒ›แƒ. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒกแƒแƒจแƒ˜ แƒ™แƒ•แƒแƒšแƒ˜แƒก แƒ‘แƒแƒ“แƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒชแƒœแƒแƒฃแƒ แƒ˜แƒ - แƒ แƒแƒ’แƒแƒ แƒช แƒ–แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒแƒกแƒ”แƒ•แƒ” แƒ˜แƒ›แƒ˜แƒขแƒแƒ›, แƒ แƒแƒ› แƒ”แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒ˜ แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒก: แƒ•แƒฃแƒ แƒ”แƒ™แƒแƒ•แƒ— แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ— invoke-SqlCmd แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒ“แƒแƒ›แƒฌแƒ”แƒ แƒšแƒแƒ‘แƒ, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒกแƒ˜แƒฆแƒ แƒ›แƒ”แƒจแƒ˜แƒช แƒ™แƒ”แƒ—แƒ“แƒ”แƒ‘แƒ

select 
  SPID,EventClass,TextData,
  Duration,Reads,Writes,CPU,
  StartTime,EndTime,DatabaseName,HostName,
  ApplicationName,LoginName
   from ::fn_trace_gettable ( @filename , default )  

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, on แƒ›แƒ”แƒ’แƒแƒ‘แƒแƒ แƒ˜ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ DBA-แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ แƒ˜แƒก Traces แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒชแƒแƒ แƒ˜แƒ”แƒšแƒ˜ แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜แƒ—, แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒคแƒ˜แƒ แƒคแƒ˜แƒขแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒ–แƒแƒ“ แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ˜แƒฆแƒแƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒ•แƒ”แƒขแƒ˜. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ— แƒแƒ› แƒ›แƒแƒ“แƒ”แƒšแƒก แƒแƒฎแƒแƒš แƒชแƒฎแƒ แƒ˜แƒšแƒจแƒ˜ แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒ—:

$dt = Get-Date -format "yyyyMMdd"
$tm = Get-Date -format "hhmmss"
$tableName = $srv + "_" + $dt + "_" + $tm
$copytab = "select * into " + $tableName + " from Model"
invoke-SqlCmd -ConnectionString $tstr -Query $copytab 

แƒ“แƒ แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒฉแƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ›แƒแƒกแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ™แƒ•แƒแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— Data.SqlClient.SqlBulkCopy - แƒแƒ›แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ–แƒ”แƒ›แƒแƒ— แƒฃแƒ™แƒ•แƒ” แƒ›แƒแƒ•แƒ˜แƒงแƒ•แƒแƒœแƒ”. แƒ“แƒ˜แƒแƒฎ, แƒแƒกแƒ”แƒ•แƒ” แƒ™แƒแƒ แƒ’แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒแƒ“แƒ แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒ”แƒ‘แƒ˜แƒก แƒœแƒ˜แƒฆแƒ‘แƒ•แƒ TextData-แƒจแƒ˜:

# mask data
foreach ($Row in $Result)
{ 
  $v = $Row["TextData"]
  $v = $v -replace "'([^']{2,})'", "'str'" -replace "[0-9][0-9]+", '999'
  $Row["TextData"] = $v
}

แƒฉแƒ•แƒ”แƒœ แƒ•แƒชแƒ•แƒšแƒ˜แƒ— แƒ”แƒ แƒ— แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ–แƒ” แƒ›แƒ”แƒขแƒ˜ แƒกแƒ˜แƒ’แƒ แƒซแƒ˜แƒก แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒ‘แƒก 999-แƒ˜แƒ—, แƒฎแƒแƒšแƒ แƒ”แƒ แƒ— แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ–แƒ” แƒ’แƒ แƒซแƒ”แƒš แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ”แƒ‘แƒก แƒ•แƒชแƒ•แƒšแƒ˜แƒ— 'str'-แƒ˜แƒ—. 0-แƒ“แƒแƒœ 9-แƒ›แƒ“แƒ” แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒ‘แƒก แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ”แƒœ แƒ“แƒ แƒแƒจแƒ”แƒ‘แƒแƒ“ แƒ“แƒ แƒ›แƒแƒ— แƒแƒ  แƒ•แƒ”แƒฎแƒ”แƒ‘แƒ˜แƒ—, แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒ’แƒ•แƒฎแƒ•แƒ“แƒ”แƒ‘แƒ แƒชแƒแƒ แƒ˜แƒ”แƒšแƒ˜ แƒ“แƒ แƒ”แƒ แƒ—แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ˜แƒแƒœแƒ˜ แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ”แƒ‘แƒ˜ - 'Y', 'N' แƒ“แƒ แƒ.แƒจ.

แƒ›แƒแƒ“แƒ˜แƒ—, แƒชแƒแƒขแƒ แƒคแƒ”แƒ แƒ˜ แƒ›แƒ˜แƒ•แƒชแƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒชแƒฎแƒแƒ•แƒ แƒ”แƒ‘แƒแƒก (แƒ›แƒ™แƒแƒชแƒ แƒแƒ“ 18+)

แƒชแƒฎแƒ แƒ˜แƒšแƒ”แƒ‘แƒจแƒ˜ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒ’แƒกแƒฃแƒ แƒ— แƒฎแƒแƒ–แƒ’แƒแƒกแƒ›แƒ˜แƒ— แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒแƒ— แƒฃแƒฏแƒ แƒ”แƒ“แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ”แƒœ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒแƒก. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, FAILS, แƒคแƒ แƒแƒ’แƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒฆแƒแƒšแƒ˜ แƒ“แƒแƒœแƒ” แƒ“แƒ แƒ.แƒจ. แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ”แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ”แƒก SQL-แƒจแƒ˜, HTML-แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ PRINT-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒขแƒ˜แƒžแƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ HTML-แƒ–แƒ” Jenkins-แƒจแƒ˜:

declare @body varchar(max), @chunk varchar(max)
set @body='<font face="Lucida Console" size="3">'
set @body=@body+'<b>Server name: '+@@servername+'</b><br>'
set @body=@body+'<br><br>'
set @body=@body+'<table><tr><th>Job</th><th>Last Run</th><th>Avg Duration, sec</th><th>Last Run, Sec</th><th>Last Status</th></tr>'
print @body

DECLARE tab CURSOR FOR SELECT '<tr><td>'+name+'</td><td>'+
  LastRun+'</td><td>'+
  convert(varchar,AvgDuration)+'</td><td>'+
  convert(varchar,LastDuration)+'</td><td>'+
    case when LastStatus<>'Succeeded' then '<font color="red">' else '' end+
      LastStatus+
      case when LastStatus<>'Succeeded' then '</font>' else '' end+
     +'</td><td>'
  from #j2
OPEN tab;  
FETCH NEXT FROM tab into @chunk
WHILE @@FETCH_STATUS = 0  
BEGIN
  print @chunk
  FETCH NEXT FROM tab into @chunk;  
END  
CLOSE tab;  
DEALLOCATE tab;
print '</table>'

แƒ แƒแƒขแƒแƒ› แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ” แƒแƒกแƒ”แƒ—แƒ˜ แƒ™แƒแƒ“แƒ˜?

SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒฏแƒ”แƒœแƒ™แƒ˜แƒœแƒกแƒจแƒ˜: แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒก แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒฃแƒคแƒ แƒ แƒšแƒแƒ›แƒแƒ–แƒ˜ แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜. ConvertTo-HTML แƒแƒ  แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒ•แƒแƒคแƒ”แƒ แƒแƒ“แƒแƒ— แƒฃแƒฏแƒ แƒ”แƒ“แƒ”แƒ‘แƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒ˜แƒœแƒ“แƒ แƒแƒ•แƒ˜แƒ แƒฉแƒ˜แƒแƒ— แƒฃแƒฏแƒ แƒ”แƒ“แƒ”แƒ‘แƒ˜ 80-แƒ–แƒ” แƒ›แƒ”แƒขแƒ˜ แƒ“แƒ 90-แƒ–แƒ” แƒ›แƒ”แƒขแƒ˜ แƒคแƒ แƒแƒ’แƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒœแƒ˜แƒก แƒ›แƒฅแƒแƒœแƒ” แƒฃแƒฏแƒ แƒ”แƒ“แƒ”แƒ‘แƒ˜. แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒกแƒขแƒ˜แƒšแƒ”แƒ‘แƒ˜:

<style>
.SQLmarkup-red { color: red; background-color: yellow; }
.SQLmarkup-yellow { color: black; background-color: #FFFFE0; }
.SQLmarkup-default { color: black; background-color: white; }
</style>

แƒ—แƒแƒ•แƒแƒ“ แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒ›แƒแƒขแƒงแƒฃแƒ”แƒ‘แƒฃแƒš แƒกแƒ•แƒ”แƒขแƒก แƒฃแƒจแƒฃแƒแƒšแƒแƒ“ แƒ›แƒแƒœแƒแƒ›แƒ“แƒ” แƒกแƒ•แƒ”แƒขแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒ˜แƒœแƒ“แƒ แƒ’แƒแƒ•แƒแƒคแƒ”แƒ แƒแƒ“แƒแƒ—. แƒกแƒ•แƒ”แƒขแƒ˜ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ˜แƒซแƒแƒฎแƒแƒก SQLmarkup-แƒ แƒแƒฆแƒแƒช:

case  
  when ps.avg_fragmentation_in_percent>=90.0 then 'SQLmarkup-red'
  when ps.avg_fragmentation_in_percent>=80.0 then 'SQLmarkup-yellow'
  else 'SQLmarkup-default' 
  end as [SQLmarkup-1], 
ps.avg_fragmentation_in_percent, 

แƒแƒฎแƒšแƒ, Powershell-แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ HTML-แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒฉแƒ•แƒ”แƒœ แƒแƒ›แƒแƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ›แƒแƒขแƒงแƒฃแƒ”แƒ‘แƒฃแƒš แƒกแƒ•แƒ”แƒขแƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒกแƒฎแƒ”แƒฃแƒšแƒจแƒ˜ แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒขแƒแƒœแƒ— แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก แƒกแƒ•แƒ”แƒขแƒ˜แƒ“แƒแƒœ แƒกแƒขแƒ˜แƒšแƒจแƒ˜. แƒ”แƒก แƒ™แƒ”แƒ—แƒ“แƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒ แƒ˜ แƒฉแƒแƒœแƒแƒชแƒ•แƒšแƒ”แƒ‘แƒ˜แƒ—:

$html = $html `
  -replace "<th>SQLmarkup[^<]*</th>", "" `
  -replace "<td>SQLmarkup-(.+?)</td><td>",'<td class="SQLmarkup-$1">'

แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜:
SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒฏแƒ”แƒœแƒ™แƒ˜แƒœแƒกแƒจแƒ˜: แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒก แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒ”แƒšแƒ”แƒ’แƒแƒœแƒขแƒฃแƒ แƒ˜ แƒแƒ แƒแƒ? แƒ—แƒฃแƒ›แƒชแƒ แƒแƒ แƒ, แƒ”แƒก แƒจแƒ”แƒฆแƒ”แƒ‘แƒ•แƒ แƒ แƒแƒฆแƒแƒชแƒแƒก แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒก
SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒฏแƒ”แƒœแƒ™แƒ˜แƒœแƒกแƒจแƒ˜: แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒก แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ