it-swarm.com.de

Welche PowerShell-Technik sollte ich verwenden, um mit SQL Server zu kommunizieren?

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, die verschiedenen Möglichkeiten, mit denen PowerShell tatsächlich mit SQL Server kommunizieren kann, in den Griff zu bekommen. 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

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

Wie soll ich entscheiden, welche dieser Techniken für verschiedene Szenarien verwendet werden soll? 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 lautet: "Verwenden Sie, was auch immer funktioniert", aber für jemanden, der neu in Powershell ist, ist es sehr verwirrend, so viele Beispiele wie oben Nr. 1 zu sehen, wenn dies die längste und (meiner Meinung nach) die geringste ist "Powershell-ähnliches" Beispiel.

Etwas mehr Informationen, falls dies relevant ist: Der SQL Server, auf dem die Monitorskripte tatsächlich ausgeführt werden, ist SQL 2005, wird jedoch verwendet, um eine Verbindung zu mehreren Instanzen von SQL 2000 bis 2008R2 herzustellen.

29
BradC

Offensichtlich hängt ein Großteil davon von einer einfachen persönlichen Entscheidung ab. Hier sind meine eigenen, persönlichen Rationalisierungen.

Ich verwende Powershell mit SQL SQL seit PSH v 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 ich sind es gewohnt Sie. Ich würde mich im Allgemeinen zu SMO neigen, da dies einige Dinge viel einfacher macht, wie das Herausschreiben 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 über -Query ausführen, wird dies unübersichtlich. Wenn Sie genau 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 das PSDrive-Ding immer klobig und hatte das Gefühl, dass sie es implementiert haben, weil sie in die Idee "Alles kann wie ein Dateisystem aussehen" verwickelt waren. Ich weiß, dass die * nix-Leute\proc und so lieben, aber ich fühle, dass sich diese Implikation 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.

7
darin strait

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

3
onupdatecascade

Ich neige 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 der Versuch, SMO zu verwenden. SMO hat seinen Platz darin, dass es ein gutes Stück Kraft hat, aber manchmal verwirrend sein kann, wenn Sie es nicht kennen.

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

Dann gibt es auch die Community-Angebote wie SQLPSX , die einen Großteil dieses SMO-Codes bereits als Cmdlets und Funktionen für Sie vorbereitet haben. Womit ich das Rad nicht neu erfinden will :)

2
user507