ΠΡΠ° ΡΡΠ°ΡΡΡ ΡΠΈΡΡΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΈ ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π° ΠΌΠΎΠ΅ΠΉ Π³ΡΡΡΡΠ½ΠΎΠΉ ΠΈΡΡΠΎΡΠΈΠΈ
ΠΠΎΡΠΎΠ²ΡΡΡ ΠΊ Zero Touch PROD Π΄Π»Ρ RDS (MS SQL), ΠΏΡΠΎ ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΠΌ ΠΏΡΠΎΠΆΡΠΆΠΆΠ°Π»ΠΈ Π²ΡΠ΅ ΡΡΠΈ, Ρ ΡΠ΄Π΅Π»Π°Π» ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΡ (POC β Proof Of Concept) Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ: Π½Π°Π±ΠΎΡΠ° powershell ΡΠΊΡΠΈΠΏΡΠΎΠ². ΠΠΎΡΠ»Π΅ ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΡΡΠΈΡ Π»ΠΈ Π±ΡΡΠ½ΡΠ΅, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π°ΠΏΠ»ΠΎΠ΄ΠΈΡΠΌΠ΅Π½ΡΡ, ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΡΡΠΈΠ΅ Π² Π½Π΅ΡΠΌΠΎΠ»ΠΊΠ°Π΅ΠΌΡΠ΅ ΠΎΠ²Π°ΡΠΈΠΈ, ΠΌΠ½Π΅ ΡΠΊΠ°Π·Π°Π»ΠΈ β Π²ΡΠ΅ ΡΡΠΎ Ρ ΠΎΡΠΎΡΠΎ, Π½ΠΎ Π²ΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ ΠΈΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ Ρ Π½Π°Ρ Π²ΡΠ΅ Jenkins slaves ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎΠ΄ Linux!
Π Π°Π·Π²Π΅ ΡΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ? ΠΠ·ΡΡΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ΅ΠΏΠ»ΠΎΠ³ΠΎ, Π»Π°ΠΌΠΏΠΎΠ²ΠΎΠ³ΠΎ DBA ΠΈΠ· ΠΏΠΎΠ΄ Windows ΠΈ ΡΡΠ½ΡΡΡ Π΅Π³ΠΎ Π² ΡΠ°ΠΌΠΎΠ΅ ΠΏΠ΅ΠΊΠ»ΠΎ powershell ΠΏΠΎΠ΄ Linux? Π Π°Π·Π²Π΅ ΡΡΠΎ Π½Π΅ ΠΆΠ΅ΡΡΠΎΠΊΠΎ?
ΠΡΠΈΡΠ»ΠΎΡΡ ΠΏΠΎΠ³ΡΡΠ·ΠΈΡΡΡΡ Π² ΡΡΡ ΡΡΡΠ°Π½Π½ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ. Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π²ΡΠ΅ ΠΌΠΎΠΈ 30+ ΡΠΊΡΠΈΠΏΡΠΎΠ² ΠΏΠ΅ΡΠ΅ΡΡΠ°Π»ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ. Π ΠΌΠΎΠ΅ΠΌΡ ΡΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΡ, Π·Π° ΠΎΠ΄ΠΈΠ½ ΡΠ°Π±ΠΎΡΠΈΠΉ Π΄Π΅Π½Ρ ΠΌΠ½Π΅ Π²ΡΠ΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ. ΠΠΈΡΡ ΠΏΠΎ Π³ΠΎΡΡΡΠΈΠΌ ΡΠ»Π΅Π΄Π°ΠΌ. ΠΡΠ°ΠΊ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ°ΠΌΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π²ΡΡΡΠ΅ΡΠΈΡΡΡΡ Π²Π°ΠΌ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ΅ powershell ΡΠΊΡΠΈΠΏΡΠΎΠ² ΠΈΠ· Windows ΠΏΠΎΠ΄ Linux?
sqlcmd vs Invoke-SqlCmd
ΠΠ°ΠΏΠΎΠΌΠ½Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ. Π‘ΡΠ°ΡΠ°Ρ Π΄ΠΎΠ±ΡΠ°Ρ ΡΡΠΈΠ»ΠΈΡΠ° sqlcmd ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ ΠΏΠΎΠ΄ Π»ΠΈΠ½ΡΠΊΡΠ°ΠΌΠΈ, Ρ ΠΏΠΎΡΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡΡ. ΠΠ²Π΅ΡΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ -Q, Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΠΉΠ» ΠΊΠ°ΠΊ -i, Π° Π²ΡΠ²ΠΎΠ΄ -o. ΠΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π΄Π΅Π»Π°ΡΡΡΡ case-sensitive. ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ -i, ΡΠΎ Π² ΡΠ°ΠΉΠ»Π΅ Π½Π°ΠΏΠΈΡΠΈΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅:
GO
EXIT
ΠΡΠ»ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ EXIT, ΡΠΎ sqlcmd ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅Ρ ΠΊ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°, Π° Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄ EXIT Π½Π΅ Π±ΡΠ΄Π΅Ρ GO, ΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ ΠΎΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π ΡΠ°ΠΉΠ» Π²ΡΠ²ΠΎΠ΄Π° ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π²Π΅ΡΡ Π²ΡΠ²ΠΎΠ΄, selects, ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, print ΠΈΡΠ΄.
Invoke-SqlCmd Π²ΡΠ΄Π°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² Π²ΠΈΠ΄Π΅ DataSet, DataTables ΠΈΠ»ΠΈ DataRows. ΠΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ select Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈ ΡΠ΅ΡΠ΅Π· sqlcmd, ΡΠ°Π·ΠΎΠ±ΡΠ°Π² Π΅Π³ΠΎ Π²ΡΠ²ΠΎΠ΄, ΡΠΎ Π²ΡΠ²Π΅ΡΡΠΈ ΡΡΠΎ-ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ΡΠ΅Π°Π»ΡΠ½ΠΎ: Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π΅ΡΡΡ Invoke-SqlCmd. ΠΠΎ Π΅ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΡΠ²ΠΎΠΈ ΠΏΡΠΈΠΊΠΎΠ»Ρ:
- ΠΡΠ»ΠΈ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΠ΅ Π΅ΠΉ ΡΠ°ΠΉΠ» ΡΠ΅ΡΠ΅Π· -InputFile, ΡΠΎ EXIT Π½Π΅ Π½ΡΠΆΠ΅Π½, Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΎΠ½ Π²ΡΠ΄Π°Π΅Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΡΡ ΠΎΡΠΈΠ±ΠΊΡ
- -OutputFile Π½Π΅Ρ, ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²Π°ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
- ΠΠ»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ° Π΅ΡΡΡ Π΄Π²Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ°: -ServerInstance -Username -Password -Database ΠΈ ΡΠ΅ΡΠ΅Π· -ConnectionString. ΠΠ°ΠΊ Π½ΠΈ ΡΡΡΠ°Π½Π½ΠΎ, Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΡΡ, ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΎΡ 1433, Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ.
- ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ Π²ΡΠ²ΠΎΠ΄, ΡΠΈΠΏΠ° PRINT, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠ½ΠΎ Β«Π»ΠΎΠ²ΠΈΡΡΡΒ» sqlcmd, Π΄Π»Ρ Invoke-SqlCmd
ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ - Π Π³Π»Π°Π²Π½ΠΎΠ΅:
ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ Π² Π²Π°ΡΠ΅ΠΌ Π»ΠΈΠ½ΡΠΊΡΠ΅ ΡΡΠΎΠ³ΠΎ cmdlet Π½Π΅Ρ!
Π ΡΡΠΎ Π³Π»Π°Π²Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. Π’ΠΎΠ»ΡΠΊΠΎ Π² ΠΌΠ°ΡΡΠ΅ ΡΡΠΎΡ cmdlet
ΠΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π sqlcmd Π΅ΡΡΡ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ -v, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊ:
# $conn ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π°ΡΠ°Π»ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ sqlcmd
$cmd = $conn + " -i D:appsSlaveJobsKillSpid.sql -o killspid.res
-v spid =`"" + $spid + "`" -v age =`"" + $age + "`""
Invoke-Expression $cmd
Π ΡΠΊΡΠΈΠΏΡΠ΅ Π½Π° SQL ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ:
set @spid=$(spid)
set @age=$(age)
Π’Π°ΠΊ Π²ΠΎΡ. Π *nix ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ -v ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ. Π£ Invoke-SqlCmd ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ -Variables. Π₯ΠΎΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π΄Π°Π΅Ρ ΡΠ°ΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ, ΡΠ°ΠΌΠΈ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ β Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠ· Shell. ΠΠ΄Π½Π°ΠΊΠΎ Ρ ΠΎΠ±ΠΈΠ΄Π΅Π»ΡΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ ΡΠ΅ΡΠΈΠ» ΠΎΡ Π½ΠΈΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ Π·Π°Π²ΠΈΡΠ΅ΡΡ, ΠΈ ΠΏΠΎΡΡΡΠΏΠΈΠ» Π³ΡΡΠ±ΠΎ ΠΈ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΠΎ, Π±Π»Π°Π³ΠΎ ΡΠΊΡΠΈΠΏΡΡ Π½Π° sql ΠΊΠΎΡΠΎΡΠΊΠΈΠ΅:
# 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"
ΠΡΠΎ, ΠΊΠ°ΠΊ Π²Ρ ΠΏΠΎΠ½ΡΠ»ΠΈ, ΡΠ΅ΡΡ ΡΠΆΠ΅ Ρ ΡΠ½ΠΈΠΊΡΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ.
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ²
Π Π²ΠΈΠ½Π΄ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Ρ ΠΌΠ΅Π½Ρ Π»ΡΠ±Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π°Π»Π°ΡΡ Π°ΡΠ΄ΠΈΡΠΎΠΌ: Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ sqlcmd, ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΡΡΠ³Π°Π½Ρ Π² output file, ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠ»ΠΈ ΡΡΠΎΡ ΡΠ°ΠΉΠ» ΠΊ ΡΠ°Π±Π»ΠΈΡΠΊΠ΅ Π°ΡΠ΄ΠΈΡΠ°. ΠΠ»Π°Π³ΠΎ SQL server ΡΠ°Π±ΠΎΡΠ°Π» Π½Π° ΡΠΎΠΌ ΠΆΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ΅, ΡΡΠΎ ΠΈ 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 ΡΠ΅Π»ΠΈΠΊΠΎΠΌ, ΠΈ ΠΏΠΈΡ Π°Π΅ΠΌ Π² ΠΏΠΎΠ»Π΅ nvarchar(max) ΡΠ°Π±Π»ΠΈΡΡ Π°ΡΠ΄ΠΈΡΠ°. Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π²ΡΡ ΡΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ°ΡΡΡΠΏΠ°Π»Π°ΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²ΠΌΠ΅ΡΡΠΎ SQL server Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» RDS, Π° BULK INSERT Π²ΠΎΠΎΠ±ΡΠ΅ ΠΏΠΎ UNC Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈΠ·-Π·Π° ΠΏΠΎΠΏΡΡΠΊΠΈ Π²Π·ΡΡΡ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΡΠΉ Π»ΠΎΠΊ Π½Π° ΡΠ°ΠΉΠ», Π° Ρ RDS ΡΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠ΅ΡΠ΅Π½ΠΎ. Π’Π°ΠΊ ΡΡΠΎ Ρ ΡΠ΅ΡΠΈΠ» ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΄ΠΈΠ·Π°ΠΉΠ½ ΡΠΈΡΡΠ΅ΠΌΡ, Ρ ΡΠ°Π½Ρ Π°ΡΠ΄ΠΈΡ ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ:
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()
}
ΠΠ»Ρ Π²ΡΠ±ΠΎΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°ΡΡ select ΠΏΠΎ ID, Π²ΡΠ±ΠΈΡΠ°Ρ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ n (identity).
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²Π»ΡΡΡ Π½Π° ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ Π²ΡΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ Jenkins.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com