Opus cum MS SQL ex Powershell in Linux

Articulus hic est mere practicus et meae tristi fabulae dicatus est

Procinctu Nulla Tactus PROD pro RDS (MS SQL), de quo omnes aures nostrae murmurabant, propositio (POC - Probatur Conceptus) automationis feci: statuto scriptorum potestatum. Post praesentationem, cum turbida ac diuturna applausus occubuit, conversus in adsiduis plausibus, dixerunt mihi - haec omnia bona sunt, sed solum ob ideologicas causas, omnes servi nostri Jenkins in Linux operantur!

Hoccine fieri potest? Talem calidam lampadem DBA sume de sub Fenestra et eam in ipso calore potentium sub Linux perstringe? Nonne crudelis est?

Opus cum MS SQL ex Powershell in Linux
Debebam me baptizare in hac nova coniunctione technologiarum. Scilicet, omnia 30+ scripta ab opere cessaverunt. Ad me mirandum, omnia in uno die operantes destinare potui. effuse scribo. Quas igitur foveas inire potes cum scripta ellebori e Fenestra in Linux transferre?

sqlcmd vs Invoke-SqlCmd

Te admoneam de summa differentia. Bonum vetus utilitatem sqlcmd Etiam sub Linux laborat cum eadem fere functione. Rogationem praeterimus ut -Q, fasciculus initus ut -i, et output ut -o. Sed tabella nomina, scilicet, sensitiva fiunt. Si uteris -i, scribe in tabella in fine:

GO
EXIT

Si in fine nullus EGRESSUS, tunc sqlcmd exspectes initus est, et si ante EXITUS nolo GOultimum mandatum non faciet. Tabella output omnia continet output, selecta, chartas, impressas, etc.

Invoca-SqlCmd eventum producit ut DataSet, DataTables vel DataRows. Ergo, si ex simplici selecto processeris, uti potes sqlcmdEx parte vero, quod complexum dici vix potest; Invoca-SqlCmd. Sed haec turma etiam iocos suos habet;

  • Si transferre fasciculum ad eam per -InputFiletum EXITUS praeterea non opus, errore syntaxi
  • -OutputFile Non, ut objectum tibi redit imperium
  • Duae sunt syntaxes pro servo designando; -ServerInstance -Username -Password -Database ac per -ConnectionString. Satis impariter, in primo casu non potest alium portum nominare quam 1433 .
  • text output, typus REPRINT, quod simpliciter est "deprensus" sqlcmdquia Invoca-SqlCmd est quaestio
  • Ac potissime: Verisimile tuum Linux hoc cmdlet non habet!

Etiam ac consectetur lacus. Hoc solum mense Martio cmdlet factus available for non-Fenestra platformsac tandem progredi!

Substitutio variabilis

sqlcmd variabilis substitutio utens -v habet, exempli gratia sic:

# $conn содСрТит Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ sqlcmd
$cmd = $conn + " -i D:appsSlaveJobsKillSpid.sql -o killspid.res 
  -v spid =`"" + $spid + "`" -v age =`"" + $age + "`""
Invoke-Expression $cmd

In SQL script utimur substitutionibus:

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

Hic itaque est. In *nix variabilis substitutiones non operantur. Parameter -v neglecta. U Invoca-SqlCmd neglecta -Variabilium. Quamvis modulus, qui ipsas variabiles specificat rationes, ignoretur, substitutiones ipsae laborant β€” quibusvis indeterminatibus e Testa uti potes. Tamen per variabiles offensus sum et ab illis omnino non pendere decrevi, et ruditer ac primitus feci, cum scripta sint SQL brevia;

# 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"

Hoc, ut intelligis, probatio est iam ex versione Unix.

Discas lima

In versione Fenestra, omnis operatio cum computo comitata est: nos sqlcmd cucurrimus, quaedam abusus in file output accipimus, hanc tabellam ad laminam electronicam adnectit. Fortunate, SQL server in eodem servo laboravit cum Jenkins, factum est simile hoc:

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

Ita fasciculum BCP totum deglutimus et in agrum tabulae computi nvarchar (max) rumpimus. Scilicet, haec tota ratio discidit, quia loco servo SQL RDS accepi, et INDO BULK per UNC omnino non laborat ob conatum exclusivum in tabula capiendi, et cum RDS hoc fere exitio est. primordio. Constitui igitur rationem systema mutare, ac per lineam computum recondere;

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

Et in hac mensa scribe sic:

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() 
  }  

Contentum seligere, eligere per ID debes, eligens in ordine n(identitatis).

Articulo sequenti diligentius aggrediar quomodo haec omnia cum Jenkins interagantur.

Source: www.habr.com