SQL Serverと通信するには、どのPowerShellテクニックを使用する必要がありますか?


29

最終的には、PowerShellを使用して、SQLインスタンスモニターに使用する古いKornShellスクリプトを置き換えたいと思います。ただし、PowerShellが実際にSQLサーバーと通信できるさまざまな方法を頭に入れて苦労しています。これがすべてかどうかはわかりませんが、SQLサーバーのバージョンを照会できる5つのまったく異なる方法を次に示します。

1. SQLConnection .NETクラス

$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プロバイダー

$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. Invoke-SQLCMD

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

これらの手法のどれを異なるシナリオに使用するかを決定するにはどうすればよいですか?それぞれに賛否両論はありますか?これらのpowershell 1.0技術の一部は2.0に取って代わりましたか?それらの一部は、SQL 2000または2005サーバーとの通信に機能しませんか?

1つのレベルでは、答えは「使用するものは何でも」であると確信していますが、Powershellを初めて使用する人にとっては、上記の#1 「powershellのような」例。

関連する場合の情報は少し多くなります。実際にモニタースクリプトを実行するSQLサーバーはSQL 2005ですが、SQL 2000から2008R2までの複数のインスタンスに接続するために使用されます。


1
最初に、素晴らしい質問と非常に徹底的な。+1。このリストは、おそらくADO.NET(最初の1つ)とSMOの2つに絞ります。WMIは少し不器用になることがあり、キーストロークが少なくても、一目で何が起こるかは「明白」ではありません。
トーマスストリンガー

回答:


7

明らかに、これの多くは単純な個人的な選択に委ねられます。ここに私自身の、個人的な、合理化があります。

PSH v 1.0以降、SQL Serverが公式に統合を開始する前に、PowershellをSQL SQLで使用していました。(PSHを始めたときは、SQL Server 2000および2005サーバーを管理していました。)それで、SMO(または、少し古い化身で、現時点ではその名前が私から逃げています)と.Netで学びました。それら。オブジェクトのスクリプトの作成など、いくつかのことを非常に簡単にするので、私は一般的にSMOに傾倒します。私自身のコードは、SMOと.Netを時々使用します。たとえば、.Netを使用して簡単な結果セットを取得する方が便利だと思います。

既存のTSQLスクリプトがたくさんある場合、Invoke-SQLCMDの方が理にかなっていると思います。文字列を作成し、-Queryを介して実行する場合、面倒になります。Powershellが.NetおよびSMOでどのように機能するかをよく理解している場合は、実行するスクリプトファイルがあるときに、Invoke-SQLCMDを時々使用するのは簡単です。

私はいつもPSDriveが不格好だと感じ、「すべてがファイルシステムのように見える」アイデアに追いついたので、彼らがそれを実装したと感じました。* nixの人たちは\ procなどを愛していることは知っていますが、この実装は一種の強制的なものだと感じています。PSDriveは大丈夫だと思います。UIが嫌いなら、物事を探索するのに良いかもしれませんが、それを使用するスクリプトを書いたことはありません。

誰もWMIプロバイダーを使用するのを見たことがありません。だから、それが私の最後の選択でしょう。

だから、私はSMOを率いて、.Netが便利なときにフォールバックします。


1
心に留めておくべきInvoke-SQLCmdことは、接続を非常に優雅に処理しないことです。スクリプトに多数の個別のクエリがある場合、接続が永続化/再利用されるか、単にドロップされず#TEMP、テーブルの永続化やリソースの問題などで予期しない問題が発生する可能性があります。
JNK

3

4は新しい作業用、5は既存のスクリプトまたは場所を再利用するためT-SQLはオブジェクトベース/ poshスタイルのコードよりも理にかなっています。それらが明確でシンプルなので、私はそれらが一番​​好きです。


2

可能な場合は、SQLPSを使用する傾向があります。これは簡単で、スクリプトで使用すると、SMOを使用するよりも読みやすく、入力が少なくなります。SMOにはかなりのパワーがあるという点でその位置がありますが、慣れていない場合は時々混乱する可能性があります。

SQL Serverのバージョンがリリースされると、SQLPSが改善されると思います。特にSQL Server 2012では、SQLPSはスナップインではなくモジュール式ではありません。これにより、Microsoftは、サービスパックまたは修正プログラム、さらにはCUを介して、SQLPSの修正または改善を行うことができます。

また、SQLPSXなどのコミュニティサービスもあります。SQLPSXには、コマンドレットおよび関数として既に用意されている多くのSMOコードがあります。私は車輪を再発明しないことについてすべてです:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.