เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ SQL เปƒเบ™ Jenkins: เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก

เบญเบตเบเป€เบ—เบทเปˆเบญ เปœเบถเปˆเบ‡ เบชเบทเบšโ€‹เบ•เปเปˆโ€‹เบซเบปเบงโ€‹เบ‚เปเป‰โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹ Zero Touch PROD เบžเบฒเบเปƒเบ•เป‰ RDS. DBAs เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป€เบŠเบตเบšเป€เบงเบต PROD เป‚เบ”เบเบเบปเบ‡, เปเบ•เปˆเบˆเบฐเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰ Jenkins เบงเบฝเบเป€เบฎเบฑเบ”เบ‡เบฒเบ™เบ—เปเบฒเบชเปเบฒเบฅเบฑเบšเบŠเบธเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบˆเปเบฒเบเบฑเบ”. DBA เป€เบ›เบตเบ”เบ•เบปเบงเบงเบฝเบเปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเป€เบงเบฅเบฒเปƒเบ”เบซเบ™เบถเปˆเบ‡เป„เบ”เป‰เบฎเบฑเบšเบˆเบปเบ”เบซเบกเบฒเบเบ—เบตเปˆเบกเบตเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ™เบตเป‰. เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปƒเบซเป‰เบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰.

เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ SQL เปƒเบ™ Jenkins: เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก

เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบปเปˆเบ‡เบžเบฝเบ‡

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ trivial เบ—เบตเปˆเบชเบธเบ”. เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ—เปเบฒโ€‹เบญเบดเบ”โ€‹เปเบกเปˆเบ™โ€‹เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบโ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบซเบเบฑเบ‡โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบงเบปเป‰เบฒโ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบเบฒเบ™ (เบœเบนเป‰โ€‹เบ‚เบฝเบ™โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹เปƒเบŠเป‰โ€‹เบงเบฝเบ FreeStyleโ€‹)โ€‹:

เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ SQL เปƒเบ™ Jenkins: เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก

sqlcmd เป€เบฎเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบกเบฑเบ™เปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰. เป€เบซเบกเบฒเบฐเบชเปเบฒเบฅเบฑเบš, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เบงเบฝเบเบชเปเบฒเบฎเบญเบ‡เบ‚เปเป‰เบกเบนเบ™:

เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ SQL เปƒเบ™ Jenkins: เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก

เบขเปˆเบฒเบฅเบทเบก, เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบชเปเบฒเบฎเบญเบ‡เบ‚เปเป‰เบกเบนเบ™ RDS / เบเบฒเบ™เบŸเบทเป‰เบ™เบŸเบนเปเบกเปˆเบ™ asynchronous, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเปเบ–เป‰เบฒเบกเบฑเบ™:

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 เปƒเบ™ Jenkins: เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบ™ CSV เปเบกเปˆเบ™ "เบ‡เปˆเบฒเบเบ”เบฒเบ". เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเบเบฑเบšเบ„เบทเบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡ TOP N CPU เปเบšเบšเบชเบญเบšเบ–เบฒเบกเบ—เบตเปˆเป€เบ‚เบฑเป‰เบกเบ‚เบธเป‰เบ™เบ”เป‰เบงเบเบงเบดเบ—เบตเบ™เบตเป‰, CSV เบˆเบฐ "corrode" เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบชเบญเบšเบ–เบฒเบกเบชเบฒเบกเบฒเบ”เบกเบตเบ•เบปเบงเบญเบฑเบเบชเบญเบ™เปƒเบ”เป† - เป€เบ„เบทเปˆเบญเบ‡เปเบฒเบเบˆเบธเบ”, เบงเบปเบ‡เบขเบทเบก, เปเบฅเบฐเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบเบฒเบ™เปเบšเปˆเบ‡เปเบ–เบง. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ.

เบชเบฑเบ™เบเบฒเบฅเบฑเบเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบกเปƒเบ™ 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, เบกเบฑเบ™เปเบกเปˆเบ™ magical, เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบกเบตเปเบ—เป‰เบซเบ™เบถเปˆเบ‡เป€เบชเบฑเป‰เบ™เปƒเบ™เบ•เบฒเบ‚เปˆเบฒเบเป„เบŸเบŸเป‰เบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบšเบฒเบ‡เบšเบฑเบ™เบซเบฒเป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบเบฒเบ™เปเบเป‰เป„เบ‚เป„เบ”เป‰เบ–เบทเบเป€เบญเบปเบฒเบกเบฒเบˆเบฒเบเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เป‚เบ”เบเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบซเบผเบฒเบ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบฎเบนเบšเปเบšเบšเบœเบปเบ™เบœเบฐเบฅเบดเบ”เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ SQL เปƒเบ™ Jenkins: เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก

เปเบ•เป‰เบกเบเบฒเบŸ

เบ„เปเบฒเป€เบ•เบทเบญเบ™: kinky code เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰!
เบกเบตเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ•เบฐเบซเบฅเบปเบเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ SQL เบ—เบตเปˆเบชเบฐเปเบ”เบ‡ CPU เบชเปเบฒเบฅเบฑเบš N เบ™เบฒเบ—เบตเบชเบธเบ”เบ—เป‰เบฒเบ - เบ›เบฐเบเบปเบ”เบงเปˆเบฒ Comrade Major เบˆเบทเปˆเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡! เบฅเบญเบ‡เปเบšเบšเบชเบญเบšเบ–เบฒเบกเบ™เบตเป‰:

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 เปƒเบ™ Jenkins: เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก

เปเบกเปˆเบ™เปเบฅเป‰เบง, Monsieur เบฎเบนเป‰เบซเบผเบฒเบเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบšเบดเบ”เป€เบšเบทเบญเบ™! เบกเบฑเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบกเบต: Powershell (เบ‚เบฝเบ™เบขเบนเปˆเปƒเบ™เบกเบฑเบ™), SQL, Xquery, HTML. เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เป€เบชเบเปƒเบˆเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบก Javascript เบเบฑเบš HTML (เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™), เปเบ•เปˆเบเบฒเบ™เบ‚เบฑเบ”เบฅเบฐเบซเบฑเบ” Python (เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เปƒเบ™ SQL) เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบ—เบธเบเบ„เบปเบ™!

SQL profiler เบ•เบดเบ”เบ•เบฒเบกเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš

เบกเบฑเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบˆเบฐเบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบš CSV เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™ TextData. เปเบ•เปˆเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเปƒเบ™เบˆเบปเบ”เบซเบกเบฒเบเบเปเปˆเป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เปเบ›เบ - เบ—เบฑเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เปเบฅเบฐเบเป‰เบญเบ™เบงเปˆเบฒเบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เบกเบฑเบเบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ•เบทเปˆเบกเบญเบตเบ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰: เบžเบงเบเป€เบฎเบปเบฒเป‚เบ—เบซเบฒเบœเปˆเบฒเบ™ เป€เบญเบตเป‰เบ™-SqlCmd script เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™, เปƒเบ™เบ„เบงเบฒเบกเป€เบฅเบดเบเบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบฑเบ™เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰

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

เบ•เปเปˆเป„เบ›, เบชเบธเบ” เป€เบžเบทเปˆเบญเบ™ เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เป‚เบ”เบ 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 เปƒเบ™ Jenkins: เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก

เปเบ•เปˆเบกเบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบชเบงเบเบ‡เบฒเบกเบเบงเปˆเบฒ. เปเบ›เบ‡เป€เบ›เบฑเบ™ 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>

เปƒเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเบ–เบฑเบ™ dummy เบ—เบฑเบ™เบ—เบตเบเปˆเบญเบ™ เบ–เบฑเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบต. เบ–เบฑเบ™เบ„เบงเบ™เบ–เบทเบเป€เบญเบตเป‰เบ™ 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, 

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เป„เบ”เป‰เบฎเบฑเบš HTML เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบ Powershell, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบญเบปเบฒเบ„เปเบฅเปเบฒ dummy เบญเบญเบเบˆเบฒเบ header, เปเบฅเบฐเปƒเบ™เบ•เบปเบงเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป‚เบญเบ™เบ„เปˆเบฒเบˆเบฒเบเบ„เปเบฅเปเบฒเป„เบ›เบซเบฒเบฎเบนเบšเปเบšเบš. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบ”เป‰เบงเบเบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบญเบ‡เบญเบฑเบ™:

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

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš:
เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ SQL เปƒเบ™ Jenkins: เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก

เบกเบฑเบ™เบชเบฐเบซเบ‡เปˆเบฒเบ‡เบฒเบกเบšเปเปˆ? เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเปเปˆเบกเบต, เบเบฒเบ™เปƒเบชเปˆเบชเบตเบ™เบตเป‰เป€เบ•เบทเบญเบ™เบ‚เป‰เบญเบเบเปˆเบฝเบงเบเบฑเบšเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡
เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ SQL เปƒเบ™ Jenkins: เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster