2011年1月20日木曜日

◆SQL Server PowerShellの環境を作る4

SQL Server PowerShellの環境を調査してきたが、リモート接続に難があったりしてあまり有用とは思えない。
たぶん、サーバー自身にタスクでスクリプトを仕掛けたりって使い方がメインになるのかな?

おそらくSQL Server PowerShellもSMOのラッパーだったりするのだろうから、今のところSMOを直接弄ったほうが使い勝手がよさげ。(環境的にもSMOをロードしておくだけだし)

というわけでSMOを使ったサンプルを。

001
002
003
004
005
006
007
008
009

[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") 
$server = 
New-Object Microsoft.SqlServer.Management.Smo.Server("Servername\instancename")
$server.ConnectionContext.LoginSecure = $false #Windows認証の時はTrue
$server.ConnectionContext.Login = "username" 
$server.ConnectionContext.Password = "password" 
$db = $server.databases["pubs"]
$result = $db.ExecuteWithResults("select * from jobs") 
$result.tables | select -ExpandProperty rows

SQLを投げるだけであればPowerShell: ◆PowershellでDBアクセス3あたりと大差ないと思うのだが、Serverオブジェクトを使えば管理タスクは何でもできそう。

ちなみに、PowerShell: ◆SQL Server PowerShellの環境を作るで作ったDBの容量一覧のスクリプトも、このServerオブジェクトを使って同様に取得できる。(結局中身は同じだろうし)

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028

[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") 
$server = 
New-Object Microsoft.SqlServer.Management.Smo.Server("Servername\instancename")
$server.ConnectionContext.LoginSecure = $false 
$server.ConnectionContext.Login = "username" 
$server.ConnectionContext.Password = "password" 

$dbinfos = @()
$fmt = "#,##0.0"
 
#データベースの数だけ繰り返し
foreach ( $db in $server.
Databases )
{
 
$dbinfo = New-Object PsObject |
 
     
select データベース名,DB,空き, データ,インデクス
  #データベース名
  $dbinfo.データベース名 = $db.
Name
 
#DBの容量
  $dbinfo.DB = $db.Size.ToString($fmt) + "MB"
  #DBの空き容量
  $dbinfo.空き = ($db.SpaceAvailable / 1024).ToString($fmt) + "MB"
  #データの容量
  $dbinfo.データ = ($db.DataSpaceUsage / 1024).ToString($fmt) + "MB"
  #インデックスの容量
  $dbinfo.インデクス = ($db.IndexSpaceUsage / 1024).ToString($fmt) + "MB"
  $dbinfos += $dbinfo
}
$dbinfos | ft –Auto

なお、SMOのロードにAdd-Typeを使うとエラーになる(環境にもよりそうだが)。
Add-Typeはストロングネームを指定する必要があるとの事。

try { Add-Type -Assembly Microsoft.SqlServer.Smo }
catch { Add-Type -Assembly 'Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' }

詳しくは以下を参照。
CTP3/V2b - Add-Type -a "Microsoft.SqlServer.Smo" won't load SMO assemblies | Microsoft Connect

0 件のコメント:

コメントを投稿