it-swarm-eu.dev

Kterou techniku ​​PowerShell bych měl použít k rozhovoru s SQL Serverem?

Nakonec bych chtěl použít PowerShell k nahrazení starých skriptů KornShell, které používáme pro monitory instance SQL. Těžko se však snažím obejít různé způsoby, kterými PowerShell dokáže mluvit s SQL serverem. Nejste si jisti, zda jsou všechny tyto, ale zde je 5 zcela odlišných způsobů, jak mohu dotazovat verzi serveru SQL:

1. SQLConnection .NET Class

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=MyServer;Database=Master;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "Select @@version as SQLServerVersion"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]

2. poskytovatel WMI

$sqlProperties = Get-WmiObject 
    -computerName "MyServer"
    -namespace root\Microsoft\SqlServer\ComputerManagement10
    -class SqlServiceAdvancedProperty
    -filter "ServiceName = 'MSSQLSERVER'"
$sqlProperties.VERSION

. SMO

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null
$smo-var = New-Object ('Microsoft.SqlServer.Management.Smo.Server') 'MyServer\instancename'
$smo-var.VersionString

4. PSDrive

Set-Location SQLSERVER:\SQL\MyServerName\
$server = Get-Item Default
$server.get_VersionString()

5. Invoke-SQLCMD

Invoke-Sqlcmd -Query "SELECT @@version" -ServerInstance "MyServer"

Jak mám postupovat při rozhodování, kterou z těchto technik použít pro různé scénáře? Existují výhody/nevýhody každého? Jsou některé z těchto technik powerhell 1.0, které byly překročeny v 2.0? Budou některé z nich pracovat pro komunikaci se servery SQL 2000 nebo 2005?

Na jedné úrovni jsem si jistý, že odpověď zní „použijte cokoli“, ale pro někoho nového Powershella je velmi matoucí vidět tolik příkladů psaných jako číslo 1 výše, když je to nejdelší a (podle mého názoru) nejméně příklad „powerhell-like“.

O něco více informací v případě, že je to relevantní: server SQL, který bude skutečně spouštět skripty monitoru, je SQL 2005, ale používá se k připojení k více instancím od SQL 2000 až do 2008R2.

29
BradC

Je zřejmé, že mnoho z toho převádí na jednoduchý osobní výběr. Tady jsou moje vlastní, osobní, racionalizace.

Powershell používám s SQL SQL od PSH v 1.0 a předtím, než jej SQL Server začal oficiálně integrovat. (Když jsem začal s PSH, spravoval jsem servery SQL Server 2000 a 2005.) Takže jsem se naučil se SMO (nebo je to o něco starší inkarnace, jejíž jméno mě v tuto chvíli uniká) a .Net a jsem zvyklý jim. Obecně bych se naklonil k SMO, protože to některé věci mnohem usnadňuje, jako je například skriptování objektů. Můj vlastní kód používá SMO někdy a .Net někdy. Myslím, že je jednodušší použít .Net například pro získání jednoduchých sad výsledků.

Myslím, že Invoke-SQLCMD dává větší smysl, pokud máte spousty existujících skriptů TSQL. Pokud vytváříte řetězce a provádíte je pomocí -Query, bude to chaotický. Pokud máte dobrý přehled o tom, jak Powershell pracuje s .Net a SMO, je používání Invoke-SQLCMD příležitostně, když máte spuštěný skriptový soubor, snadné.

Vždy jsem zjistil, že věc PSDrive je neohrabaná a cítil jsem, že ji implementovali, protože se dostali do myšlenky „všechno může vypadat jako souborový systém“. Vím, že kluci * nix milují\proc a podobně, ale mám pocit, že tato implementace se cítí trochu nucená. Myslím si, že PSDrive je v pořádku, možná i dobré, pokud nenávidíte UI, pro zkoumání věcí, ale nikdy jsem nenapsal skript, který jej používá.

Nikdy jsem nikoho neviděl používat poskytovatele WMI. To by byla moje poslední volba.

Takže bych šel s SMO a vrátil se k .Net, když to bude chytřejší.

7
darin strait

4 pro novou práci, 5 pro opakované použití existujících skriptů nebo míst T-SQL dává větší smysl než objektový/poshový kód stylu. Líbí se mi ty nejlepší, protože jsou jasné a jednoduché.

3
onupdatecascade

Mám sklon se k používání SQLPS, pokud mohu. Je to jednodušší a pokud ho používám ve skriptech, je mnohem snazší číst a psát méně než snažit se používat SMO. SMO má své místo v tom, že má dobrý kousek síly, ale může být matoucí, když ho neznáte.

Myslím, že jakmile budou vydány SQL Serverové verze, SQLPS bude vylepšen. Zejména od SQL Server 2012 není SQLPS modulární místo toho, aby byl snapin. To umožní společnosti Microsoft vytisknout opravy nebo vylepšení s SQLPS prostřednictvím aktualizací Service Pack nebo oprav hotfix, případně i CU.

Pak jsou tu také komunitní nabídky jako SQLPSX , které již mají pro vás připravené spousty kódu SMO jako rutiny cmdlet a funkce. Což jsem vše o tom, že kolo nevynalézat :)

2
user507