web-dev-qa-db-ja.com

データベースを識別するPowerShellスクリプト

私は十分なPowerShellスキルを持っていますが、SQLサーバーを使用するスキルはありません。 PowerShellを使用してリモートSQLサーバーに関する情報を取得し、サーバー上で実行されているデータベースを特定する方法の正しい方向を誰かに教えてもらえますか?.

助けてくれてありがとう。

編集-SMOコードの使用

このコードをまとめてみましたが、エラーが発生しました:タイプが見つかりません[Microsoft.SqlServer.Management.Smo.Server]このタイプを含むアセンブリがロードされていることを確認してください

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$sqlServer = New-Object("Microsoft.SqlServer.Management.Smo.Server") "MSQLULTDBS04"
foreach($sqlDatabase in $sqlServer.databases) {$sqlDatabase.name}
9
The Woo

2つのオプションがあり、どちらも、コマンドを実行しているホストにSQL Server Management Studioをインストールする必要があります

  1. SQLPS
  2. SMO

インスタンスのオブジェクトのリストを取得するなどの基本的なタスクを学ぶのに少し簡単な形式が含まれているので、後者に傾いています。

SMOでは、使用する適切な assemblies をロードする必要があります。ほとんどの場合 Microsoft.sqlserver.management.smo.serverが最も一般的に使用されます。

SQLPSでは、使用しているSQL Serverのバージョンを知る必要があります。 SQL Server 2008 R2(およびR1)はadd-pssnapin *sql*およびSQL Server 2012以降ではimport-module SQLPS

次に、データベースのリストを取得する際の問題について説明します。

SQLPSメソッド

dir SQLSERVER:\\SQL\ServerName\Default\Databases | select name

上記はデフォルトの名前付きインスタンスの場合です。名前付きインスタンスの場合は、「default」をインスタンス名に変更します。

SMOメソッド

$srv = New-Object 'Microsoft.SqlServer.Management.SMO.Server' "myInstance"
$srv.Databases | select name

これで、上記のコードを関数または各ループに簡単にラップできるため、複数のサーバー名を簡単に渡すことができます。

編集

PowerShellでどのような文献を読むかに応じて、スクリプトを書くのに時間がかかるほとんどの人は、スクリプトを繰り返し使用できるようにするために時間を費やします。これは、関数(私にとっては基本レベル)とモジュール(まだ触れていないより高度なモジュール)のいずれかを介して行われます。

だからあなたのサンプルコードのために:

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$sqlServer = New-Object("Microsoft.SqlServer.Management.Smo.Server") "MSQLULTDBS04"
foreach($sqlDatabase in $sqlServer.databases) {$sqlDatabase.name}

データベースのリストを出力するためにforeachループは必要ありません。これはSMO内のオブジェクトで、複数のプロパティが含まれています。そのうちの1つはnameで、PowerShellは以下に示すように、デフォルトの形式で出力します。 enter image description here ここでSMOとSQLPSの違いに注意する必要があるのは、SQLPSはデフォルトではシステムデータベースを出力しないため、SMOは出力するということです。

PowerShellプロファイルのブログ投稿を検索する場合、一般的に行うことは、それにアセンブリコマンドを追加することです。これにより、PowerShellコマンドを開くときはいつでも、既に使用できます。次に、基本的に頻繁に使用するコマンドである関数を追加し、たまたまデータベース用の関数を追加します。

function Get-DBList ($server)
{
    $srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $server
    $srv.Databases | Select name, RecoveryModel, 
        @{Label="CompatibilityLevel";Expression={($_.CompatibilityLevel).ToString().Replace("Version", "")}}
} #end Get-DBList

これはお好みに応じて変更できますが、ローカルインスタンスを使用して呼び出すと、以下の出力が得られます。 enter image description here

私は先に進み、私が難しい方法で見つけた何かをあなたに知らせます。 SMOを使用すると、SQL Server 2000からSQL Server 2014まで接続できますが、SQL Serverの各バージョンは、特定のプロパティの場所によって異なります。午後にツイッターでジョナサンケハヤと会話を学びましたが、このことを学びましたが、探していた物件を思い出せません。これらの状況では、 MSO for SMOの.NETクラスライブラリ は、探しているプロパティへのガイドに役立つため、友だちです。

12
user507

SQLPSモジュールをインポートしたら、 Invoke-SQLcmd も使用できます。たとえば、

Import-Module SQLPS -DisableNameChecking
Invoke-SQLcmd -Server '.\sql2012' -Database master 'select * from sys.databases' | Format-Table
2
wBob