Mit welcher PowerShell-Technik sollte ich mit SQL Server kommunizieren?

29

Letztendlich möchte ich PowerShell verwenden, um die alten KornShell-Skripte zu ersetzen, die wir für SQL-Instanzmonitore verwenden. Es fällt mir jedoch schwer, mich mit all den verschiedenen Möglichkeiten auseinanderzusetzen, mit denen PowerShell tatsächlich mit SQL Server kommunizieren kann. Ich bin mir nicht sicher, ob dies alles ist, aber hier sind 5 völlig verschiedene Möglichkeiten, wie ich die Version eines SQL-Servers abfragen kann:

1. SQLConnection .NET-Klasse

$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. WMI-Anbieter

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

3. 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. Rufen Sie-SQLCMD auf

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

Wie soll ich entscheiden, welche dieser Techniken für verschiedene Szenarien verwendet werden sollen? Gibt es Vor- / Nachteile von jedem? Sind einige dieser Powershell 1.0-Techniken in 2.0 überholt? Funktionieren einige von ihnen nicht für die Kommunikation mit SQL 2000- oder 2005-Servern?

Auf einer Ebene bin ich sicher, dass die Antwort "benutze, was auch immer funktioniert" ist, aber für jemanden, der neu bei Powershell ist, ist es sehr verwirrend, so viele Beispiele wie oben Nr. 1 zu sehen, wenn dies die längste und (meiner Meinung nach) geringste ist "Powershell-like" Beispiel.

Etwas mehr Informationen, falls dies relevant ist: Der SQL Server, auf dem die Monitorskripten ausgeführt werden, ist SQL 2005, wird jedoch für die Verbindung zu mehreren Instanzen von SQL 2000 bis 2008R2 verwendet.

BradC
quelle
1
Zunächst einmal eine gute Frage und sehr gründlich. +1. Ich würde diese Liste wahrscheinlich auf zwei beschränken: ADO.NET (Ihre erste) und SMO. WMI kann etwas umständlich sein, und auch wenn es weniger Tastenanschläge sind, ist es auf den ersten Blick nicht so "offensichtlich", was passieren wird.
Thomas Stringer

Antworten:

7

Offensichtlich hängt ein Großteil davon mit einfachen persönlichen Entscheidungen zusammen. Hier sind meine persönlichen Rationalisierungen.

Ich verwende Powershell mit SQL SQL seit PSH 1.0, und bevor SQL Server offiziell damit begann, es zu integrieren. (Als ich mit PSH anfing, verwaltete ich SQL Server 2000- und 2005-Server.) Also lernte ich mit SMO (oder einer etwas älteren Inkarnation, deren Name mir im Moment entgeht) und .Net und bin es gewohnt Sie. Ich würde mich im Allgemeinen für SMO entscheiden, da dies einige Dinge viel einfacher macht, beispielsweise das Ausschreiben von Objekten. Mein eigener Code verwendet manchmal SMO und manchmal .Net. Ich denke, es ist einfacher, .Net zu verwenden, um beispielsweise einfache Ergebnismengen zu erhalten.

Ich denke, dass Invoke-SQLCMD sinnvoller ist, wenn Sie viele vorhandene TSQL-Skripte haben. Wenn Sie Zeichenfolgen erstellen und diese über -Query ausführen, wird dies problematisch. Wenn Sie wissen, wie Powershell mit .Net und SMO funktioniert, ist es einfach, Invoke-SQLCMD gelegentlich zu verwenden, wenn Sie eine Skriptdatei ausführen müssen.

Ich fand die PSDrive-Sache immer klobig und hatte das Gefühl, dass sie implementiert wurde, weil sie in die Idee verstrickt waren, dass "alles wie ein Dateisystem aussehen kann". Ich weiß, dass die * nix-Leute \ proc und so lieben, aber ich fühle, dass sich diese Implementierung irgendwie gezwungen anfühlt. Ich denke, dass PSDrive in Ordnung ist, vielleicht sogar gut, wenn Sie die Benutzeroberfläche hassen, um Dinge zu erkunden, aber ich habe noch nie ein Skript geschrieben, das es verwendet.

Ich habe noch nie jemanden gesehen, der den WMI-Anbieter verwendet. Das wäre also meine letzte Wahl.

Also würde ich mit SMO führen und auf .Net zurückgreifen, wenn es einfacher ist.

darin straße
quelle
1
Zu beachten Invoke-SQLCmdist, dass Verbindungen nicht sehr elegant gehandhabt werden. Wenn Sie ein Skript mit vielen separaten Abfragen haben, werden Verbindungen möglicherweise beibehalten / wiederverwendet oder einfach nicht getrennt, was zu unerwarteten Problemen mit beispielsweise vorhandenen #TEMPTabellen oder Ressourcenproblemen führen kann.
JNK
3

4 für neue Arbeiten, 5 für die Wiederverwendung vorhandener Skripte oder Stellen T-SQL ist sinnvoller als objektbasierter / nobler Code. Ich mag diese am besten, weil sie klar und einfach sind.

onupdatecascade
quelle
2

Ich tendiere dazu, SQLPS zu verwenden, wenn ich kann. Es ist einfacher, und wenn ich es in Skripten verwende, ist es viel einfacher zu lesen und weniger zu tippen als SMO. SMO hat seinen Platz darin, dass es ein gutes Stück Leistung hat, aber manchmal verwirrend sein kann, wenn Sie mit ihm nicht vertraut sind.

Ich denke, wenn SQL Server-Versionen veröffentlicht werden, wird das SQLPS verbessert. Zumal mit SQL Server 2012 SQLPS nicht modular ist, anstatt ein Snapin zu sein. Dadurch kann Microsoft Fixes oder Verbesserungen mit SQLPS über Service Packs oder Hotfixes, möglicherweise sogar über CUs, veröffentlichen.

Hinzu kommen Community-Angebote wie SQLPSX , bei denen ein Großteil des SMO-Codes bereits als Cmdlets und Funktionen für Sie vorbereitet ist. Worum es mir geht, das Rad nicht neu zu erfinden :)

Shawn Melton
quelle