เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš MS SQL เบˆเบฒเบ Powershell เปƒเบ™ Linux

เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบตเป‰โ€‹เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบขเปˆเบฒเบ‡โ€‹เบ”เบฝเบงโ€‹เปเบฅเบฐโ€‹เบญเบธโ€‹เบ—เบดเบ”โ€‹เบ•เบปเบ™โ€‹เป€เบžเบทเปˆเบญโ€‹เป€เบฅเบทเปˆเบญเบ‡โ€‹เบ—เบตเปˆโ€‹เป‚เบชเบโ€‹เป€เบชเบปเป‰เบฒโ€‹เบ‚เบญเบ‡โ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹

เบเบฒเบ™เบเบฝเบกเบžเป‰เบญเบกเบชเปเบฒเบฅเบฑเบš Zero Touch PROD เบชเปเบฒเบฅเบฑเบš RDS (MS SQL), เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ—เบตเปˆเบซเบนเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™ buzzing, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต (POC - เบซเบผเบฑเบเบ–เบฒเบ™เบชเบฐเปเบ”เบ‡เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”) เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”: เบŠเบธเบ”เบ‚เบญเบ‡ powershell scripts. เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบปเบกเบžเบฒเบเบธ, เบชเบฝเบ‡เบ•เบปเบšเบกเบทเบ—เบตเปˆเบเบฒเบงเบ™เบฒเบ™เป„เบ”เป‰เป€เบชเบเบŠเบตเบงเบดเบ”เบฅเบปเบ‡, เบเบฒเบเป€เบ›เบฑเบ™เบชเบฝเบ‡เบ•เบปเบšเบกเบทเบ—เบตเปˆเบšเปเปˆเบขเบธเบ”เบขเบฑเป‰เบ‡, เบžเบงเบเป€เบ‚เบปเบฒเบšเบญเบเบ‚เป‰เบญเบ - เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบ”เบต, เปเบ•เปˆเบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบญเบธเบ”เบปเบกเบเบฒเบ™, เบ—เบฒเบ” Jenkins เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™ Linux!

เบญเบฑเบ™เบ™เบตเป‰เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบšเป? เป€เบญเบปเบฒเบซเบฅเบญเบ”เป„เบŸ DBA เบ—เบตเปˆเบญเบปเบšเบญเบธเปˆเบ™เบˆเบฒเบเบžเบฒเบเปƒเบ•เป‰ Windows เปเบฅเบฐเบ•เบดเบ”เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ„เบงเบฒเบกเบฎเป‰เบญเบ™เบ‚เบญเบ‡ powershell เบžเบฒเบเปƒเบ•เป‰ Linux? เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเป‚เบซเบ”เบฎเป‰เบฒเบเบšเป?

เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš MS SQL เบˆเบฒเบ Powershell เปƒเบ™ Linux
เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เบเบฑเบ‡โ€‹เบ•เบปเบงโ€‹เป€เบญเบ‡โ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบชเบปเบกโ€‹เบ›เบฐโ€‹เบชเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เปเบ›เบโ€‹เบ‚เบญเบ‡โ€‹เป€เบ•เบฑเบโ€‹เป‚เบ™โ€‹เป‚เบฅโ€‹เบŠเบตโ€‹เบ™เบตเป‰. เปเบ™เปˆเบ™เบญเบ™, เบชเบฐเบ„เบฃเบดเบšเบ—เบฑเบ‡เปเบปเบ” 30+ เบ‚เบญเบ‡เบ‚เป‰เบญเบเบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบ. เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเปเบ›เบเปƒเบˆเบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบ‚เป‰เบญเบเป„เบ”เป‰เปเบเป‰เป„เบ‚เบ—เบธเบเบขเปˆเบฒเบ‡เปƒเบ™เบกเบทเป‰เป€เบฎเบฑเบ”เบงเบฝเบ. เบ‚เป‰เบญเบเบเปเบฒเบฅเบฑเบ‡เบ‚เบฝเบ™เปƒเบ™เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบฎเป‰เบญเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบžเบปเบšเบญเบธเบ›เบฐเบชเบฑเบเบญเบฑเบ™เปƒเบ”เปƒเบ™เป€เบงเบฅเบฒเป‚เบญเบ™ script powershell เบˆเบฒเบ Windows เป„เบ› Linux?

sqlcmd เบ—เบฝเบšเบเบฑเบš Invoke-SqlCmd

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เปเป€เบ•เบทเบญเบ™เบ—เปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ•เบปเป‰เบ™เบ•เปเบฅเบฐเบซเบงเปˆเบฒเบ‡เบžเบงเบเบกเบฑเบ™. เบ›เบฐเป‚เบซเบเบ”เป€เบเบปเปˆเบฒเบ”เบต sqlcmd เบกเบฑเบ™เบเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบžเบฒเบเปƒเบ•เป‰ Linux, เบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบเบทเบญเบšเบ„เบทเบเบฑเบ™. เบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ” -Q, เป„เบŸเบฅเปŒเบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ›เบฑเบ™ -i, เปเบฅเบฐเบœเบปเบ™เบœเบฐเบฅเบดเบ”เป€เบ›เบฑเบ™ -o. เปเบ•เปˆเบŠเบทเปˆเป„เบŸเบฅเปŒ, เปเบ™เปˆเบ™เบญเบ™, เบ–เบทเบเบชเป‰เบฒเบ‡เป€เบ›เบฑเบ™เบ•เบปเบงเบžเบดเบกเบ™เป‰เบญเบ. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰ -i, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบ™เป„เบŸเบฅเปŒเบ‚เบฝเบ™เบขเบนเปˆเบ—เป‰เบฒเบ:

GO
EXIT

เบ–เป‰เบฒเบšเปเปˆเบกเบต EXIT เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบ, sqlcmd เบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบฅเปเบ–เป‰เบฒเบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™, เปเบฅเบฐเบ–เป‰เบฒเบเปˆเบญเบ™ เบญเบญเบ เบˆเบฐเบšเปเปˆ GO, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบชเบธเบ”เบ—เป‰เบฒเบเบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ. เป„เบŸเบฅเปŒเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”, เป€เบฅเบทเบญเบ, เบ‚เปเป‰เบ„เบงเบฒเบก, เบžเบดเบก, เปเบฅเบฐเบญเบทเปˆเบ™เป†.

Invoke-SqlCmd เบœเบฐเบฅเบดเบ”เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป€เบ›เบฑเบ™ DataSet, DataTables เบซเบผเบท DataRows. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เป€เบฅเบทเบญเบเปเบšเบšเบ‡เปˆเบฒเบเป†, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰ sqlcmd, เป‚เบ”เบเป„เบ”เป‰เบงเบดเป€เบ„เบฒเบฐเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ‚เบญเบ‡เบกเบฑเบ™, เบกเบฑเบ™เป€เบเบทเบญเบšเป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™: เบชเปเบฒเบฅเบฑเบšเบ™เบตเป‰เบกเบต เบฎเบฝเบเบฎเป‰เบญเบ‡-SqlCmd. เปเบ•เปˆเบ—เบตเบกเบ‡เบฒเบ™เบ™เบตเป‰เบเบฑเบ‡เบกเบตเป€เบฅเบทเปˆเบญเบ‡เบ•เบฐเบซเบฅเบปเบเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡:

  • เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป‚เบญเบ™เป„เบŸเบฅเปŒเป„เบ›เบซเบฒเบ™เบฒเบ‡เบœเปˆเบฒเบ™ -InputFile, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบญเบญเบ เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” syntax
  • -OutputFile เบšเปเปˆ, เบ„เปเบฒเบชเบฑเปˆเบ‡เบชเบปเปˆเบ‡เบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบ›เบฑเบ™เบงเบฑเบ”เบ–เบธ
  • เบกเบตเบชเบญเบ‡ syntax เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบฐเบšเบธเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ: -ServerInstance -เบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰ -Password -Database เปเบฅเบฐเบœเปˆเบฒเบ™ -ConnectionString. Oddly เบžเบฝเบ‡เบžเป, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เปเบฒเบญเบดเบ”เบกเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเบˆเบฐเบฅเบฐเบšเบธเบžเบญเบ”เบญเบทเปˆเบ™เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบ 1433.
  • เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ‚เปเป‰เบ„เบงเบฒเบก, เบžเบดเบก PRINT, เป€เบŠเบดเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆ "เบˆเบฑเบšเป„เบ”เป‰" sqlcmdเบชเบณ เบฅเบฑเบš เบฎเบฝเบเบฎเป‰เบญเบ‡-SqlCmd เป€เบ›เบฑเบ™เบšเบฑเบ™เบซเบฒ
  • เปเบฅเบฐเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”: เบชเปˆเบงเบ™เบซเบผเบฒเบเบญเบฒเบ”เบˆเบฐ Linux เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบšเปเปˆเบกเบต cmdlet เบ™เบตเป‰!

เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบซเบฒเบ•เบปเป‰เบ™เบ•เป. เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เป€เบ”เบทเบญเบ™เบกเบตเบ™เบฒเบ™เบตเป‰ cmdlet เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเป€เบงเบ—เบตเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™ Windows, เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบเป‰เบฒเบงเป„เบ›เบ‚เป‰เบฒเบ‡เบซเบ™เป‰เบฒ!

เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ—เบ™เบ•เบปเบงเปเบ›

sqlcmd เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ—เบ™เบ•เบปเบงเปเบ›เป‚เบ”เบเปƒเบŠเป‰ -v, เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

# $conn ัะพะดะตั€ะถะธั‚ ะฝะฐั‡ะฐะปะพ ะบะพะผะฐะฝะดั‹ sqlcmd
$cmd = $conn + " -i D:appsSlaveJobsKillSpid.sql -o killspid.res 
  -v spid =`"" + $spid + "`" -v age =`"" + $age + "`""
Invoke-Expression $cmd

เปƒเบ™ SQL script เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™:

set @spid=$(spid)
set @age=$(age)

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบกเบฑเบ™เปเบกเปˆเบ™. เปƒเบ™ *nix เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ—เบ™เบ•เบปเบงเปเบ›เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ. เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต -v เบšเปเปˆเบชเบปเบ™เปƒเบˆ. U เบฎเบฝเบเบฎเป‰เบญเบ‡-SqlCmd เบšเปเปˆเบชเบปเบ™เปƒเบˆ - เบ•เบปเบงเปเบ›. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ›เบ‚เบญเบ‡เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบˆเบฐเบ–เบทเบเบฅเบฐเป€เบงเบฑเป‰เบ™, เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เป€เบฎเบฑเบ”เบงเบฝเบ - เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเปเบ›เปƒเบ”เป†เบˆเบฒเบ Shell. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบฎเบนเป‰เบชเบถเบเบœเบดเบ”เบซเบงเบฑเบ‡เบเบฑเบšเบ•เบปเบงเปเบ›เปเบฅเบฐเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบšเปเปˆเบ‚เบถเป‰เบ™เบเบฑเบšเบžเบงเบเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเปˆเบฒเบ‡เป‚เบซเบ”เบฎเป‰เบฒเบเปเบฅเบฐเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™, เป€เบžเบฒเบฐเบงเปˆเบฒ SQL scripts เบชเบฑเป‰เบ™:

# prepend the parameters  
"declare @age int, @spid int" | Add-Content "q.sql"
"set @spid=" + $spid | Add-Content "q.sql"
"set @age=" + $age | Add-Content "q.sql"

foreach ($line in Get-Content "Sqlserver/Automation/KillSpid.sql") { 
  $line | Add-Content "q.sql" 
  }
$cmd = "/opt/mssql-tools/bin/" + $conn + " -i q.sql -o res.log"

เบ™เบตเป‰, เบ•เบฒเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆ, เปเบกเปˆเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเป‰เบงเบˆเบฒเบเบชเบฐเบšเบฑเบš Unix.

เบเบณ เบฅเบฑเบ‡เบญเบฑเบšเป‚เบซเบผเบ”เป„เบŸเบฅ

เปƒเบ™เบชเบฐเบšเบฑเบš Windows, เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เปƒเบ”เป†เปเบกเปˆเบ™เบกเบฒเบžเป‰เบญเบกเบเบฑเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบš: เบžเบงเบเป€เบฎเบปเบฒเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ sqlcmd, เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฅเปˆเบงเบ‡เบฅเบฐเป€เบกเบตเบ”เบšเบฒเบ‡เบ›เบฐเป€เบžเบ”เปƒเบ™เป„เบŸเบฅเปŒเบœเบปเบ™เบœเบฐเบฅเบดเบ”, เบ„เบฑเบ”เบ•เบดเบ”เป„เบŸเบฅเปŒเบ™เบตเป‰เปƒเบชเปˆเปเบœเปˆเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบš. เป‚เบŠเบเบ”เบต, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ SQL เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ”เบฝเบงเบเบฑเบ™เบเบฑเบš Jenkins, เบกเบฑเบ™เป„เบ”เป‰เป€เบฎเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

CREATE procedure AuditUpload
  @id int, @filename varchar(256)
as
  set nocount on
  declare @sql varchar(max)

  CREATE TABLE #multi (filer NVARCHAR(MAX))
  set @sql='BULK INSERT #multi FROM '''+@filename
    +''' WITH (ROWTERMINATOR = '' '',CODEPAGE = ''ACP'')'
  exec (@sql)
  select @sql=filer from #multi
  update JenkinsAudit set multiliner=@sql where ID=@id
  return

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบเบทเบ™เป„เบŸเบฅเปŒ BCP เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐ shove เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก nvarchar (max) เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบเบงเบ”เบชเบญเบš. เปเบ™เปˆเบ™เบญเบ™, เบฅเบฐเบšเบปเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เป„เบ”เป‰เปเบ•เบเปเบเบ, เป€เบžเบฒเบฐเบงเปˆเบฒเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ SQL เบ‚เป‰เบญเบเป„เบ”เป‰เบฎเบฑเบš RDS, เปเบฅเบฐ BULK INSERT เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบฑเบ‡เบซเบกเบปเบ”เป‚เบ”เบเบœเปˆเบฒเบ™ UNC เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบ—เบตเปˆเบˆเบฐเบฅเบฑเบญเบเป„เบŸเบฅเปŒ, เปเบฅเบฐ RDS เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบงเบ™เบตเป‰เปเบกเปˆเบ™ doomed เบˆเบฒเบ. เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบ›เปˆเบฝเบ™เบเบฒเบ™เบญเบญเบเปเบšเบšเบฅเบฐเบšเบปเบš, เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบเบฒเบ™เบเบงเบ”เบชเบญเบšเป‚เบ”เบเบชเบฒเบ:

CREATE TABLE AuditOut (
  ID int NULL,
  TextLine nvarchar(max) NULL,
  n int IDENTITY(1,1) PRIMARY KEY
  )

เปเบฅเบฐเบ‚เบฝเบ™เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ™เบตเป‰:

function WriteAudit([string]$Filename, [string]$ConnStr, 
     [string]$Tabname, [string]$Jobname)
{
  # get $lastid of the last execution  -- ะฟั€ะพัะบะธะฟะฐะฝะพ ะดะปั ัั‚ะฐั‚ัŒะธ
	
  #create grid and populate it with data from file
  $audit =  Get-Content $Filename
  $DT = new-object Data.DataTable   

  $COL1 =  new-object Data.DataColumn; 
  $COL1.ColumnName = "ID"; 
  $COL1.DataType =  [System.Type]::GetType("System.Int32") 

  $COL2 =  new-object Data.DataColumn; 
  $COL2.ColumnName = "TextLine"; 
  $COL2.DataType =  [System.Type]::GetType("System.String") 
  
  $DT.Columns.Add($COL1) 
  $DT.Columns.Add($COL2) 
  foreach ($line in $audit) 
    { 
    $DR = $dt.NewRow()   
    $DR.Item("ID") = $lastid
    $DR.Item("TextLine") = $line
    $DT.Rows.Add($DR)   
    } 

  # write it to table
  $conn=new-object System.Data.SqlClient.SQLConnection 
  $conn.ConnectionString = $ConnStr
  $conn.Open() 
  $bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $ConnStr
  $bulkCopy.DestinationTableName = $Tabname 
  $bulkCopy.BatchSize = 50000
  $bulkCopy.BulkCopyTimeout = 0
  $bulkCopy.WriteToServer($DT) 
  $conn.Close() 
  }  

เป€เบžเบทเปˆเบญเป€เบฅเบทเบญเบเป€เบ™เบทเป‰เบญเบซเบฒ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฅเบทเบญเบเป‚เบ”เบ ID, เป€เบฅเบทเบญเบเปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ n (เบ•เบปเบงเบ•เบปเบ™).

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบžเบปเบงเบžเบฑเบ™เบเบฑเบš Jenkins.

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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™