SQL Server PowerShell の実行

SQL Server では、Windows PowerShell、および Windows PowerShell で SQL Server の機能を公開する SQL Server スナップインのセットがインストールされます。これにより、SQL Server オブジェクトを操作する Windows PowerShell スクリプトのコードを作成できます。スクリプトは、Windows PowerShell 環境の SQL Server Management Studio で SQL Server エージェント ジョブとして実行できます。

SQL Server PowerShell サポートのインストール

Windows PowerShell スクリプトの実行に必要なソフトウェアを、SQL Server セットアップを使用してインストールします。SQL Server 2008 以降、セットアップでクライアント ソフトウェアまたはデータベース サービス ノードを選択すると、以下の Windows PowerShell コンポーネントがインストールされます。

  • Windows PowerShell 1.0 (コンピューターに Windows PowerShell がまだ存在しない場合)。

  • SQL Server スナップイン。スナップインは、SQL Server 用の以下の 2 種類の Windows PowerShell サポートを実装する dll ファイルです。

    • SQL Server コマンドレットのセット。コマンドレットは特定の操作を実装するコマンドです。たとえば、Invoke-Sqlcmd では、sqlcmd ユーティリティを使用して実行することもできる Transact-SQL スクリプトまたは XQuery スクリプトが実行され、Invoke-PolicyEvaluation では、SQL Server オブジェクトがポリシー ベースの管理ポリシーに準拠しているかどうかが報告されます。

    • SQL Server プロバイダー。プロバイダーでは、ファイル システム パスと同様のパスを使用して、SQL Server オブジェクトの階層内を移動できます。各オブジェクトは、SQL Server 管理オブジェクト モデルのクラスに関連付けられています。クラスのメソッドやプロパティを使用して、オブジェクトの操作を実行できます。たとえば、パスでデータベース オブジェクトに移動した場合、Microsoft.SqlServer.Managment.SMO.Database クラスのメソッドとプロパティを使用してデータベースを管理できます。

  • SQL Server スナップインを含む Windows PowerShell セッションの実行に使用される sqlps ユーティリティ。

SQL Server 2008 以降、SQL Server Management Studio は、オブジェクト エクスプローラー ツリーからの Windows PowerShell セッションの起動をサポートします。また、SQL Server 2008 以降で、SQL Server エージェントは、Windows PowerShell ジョブ ステップをサポートします。

セットアップの終了後に Windows PowerShell がアンインストールされると、Windows PowerShell 用の SQL Server 機能は機能しなくなります。Windows PowerShell をアンインストールできるのは Windows ユーザーです。また、Windows PowerShell のアンインストールは、Windows オペレーティング システムのアップグレードで必要になる場合があります。Windows PowerShell がアンインストールされている場合に SQL Server 機能を使用するには、次のいずれかの操作を実行する必要があります。

  • Microsoft ダウンロード センターから Windows PowerShell 1.0 を手動でダウンロードして再インストールします。ダウンロードの手順については、Windows Server 2003Web サイトを参照してください。

  • Windows Server 2008 を実行している場合、Windows PowerShell 1.0 はオペレーティング システムに存在しますが、既定では無効になっています。Windows PowerShell は、Windows Server 2008 から再度有効にすることができます。

サポートされる SQL Server のバージョン

Windows PowerShell を実行するには、SQL Server 2008 クライアント コンポーネントを使用する必要があります。Windows PowerShell は、SQL Server 2000 以降のインスタンスに接続できます。SQL Server 2005 の使用できる最も古いバージョンは SP2 です。SQL Server 2000 の使用できる最も古いバージョンは SP4 です。Windows PowerShell が SQL Server 2005 および SQL Server 2000 に接続する場合、その機能は、SQL Server のこれらのバージョンで利用できる機能に制限されます。

sqlps ユーティリティの使用

sqlps は、Windows PowerShell 環境を作成し、SQL Server スナップインの読み込みと登録を行うユーティリティです。sqlps を使用して、次のことを行えます。

  • Windows PowerShell コマンドを対話的に実行する。

  • Windows PowerShell スクリプト ファイルを実行する。

  • SQL Server コマンドレットを実行する。

  • SQL Server プロバイダー パスを使用して SQL Server オブジェクトの階層内を移動する。

既定では、sqlps 実行時のスクリプト実行ポリシーは Restricted に設定されます。これにより、Windows PowerShell スクリプトの実行が防止されます。Set-ExecutionPolicy コマンドレットを使用すると、署名されたスクリプトまたは任意のスクリプトの実行を有効化できます。信頼できるソースからのスクリプト以外は実行しないでください。また、適切な NTFS 権限を使用して、すべての入力ファイルと出力ファイルのセキュリティを保護してください。Windows PowerShell スクリプトの有効化の詳細については、「Windows PowerShell スクリプトの実行」を参照してください。

詳細については、「sqlps ユーティリティ」を参照してください。

SQL Server Management Studio での Windows PowerShell の使用

SQL Server Management Studio で Windows PowerShell セッションを起動するには、オブジェクト エクスプローラーでオブジェクトを右クリックし、[PowerShell の起動] をクリックします。SQL Server Management Studio で、SQL Server PowerShell スナップインの読み込みと登録が完了した Windows PowerShell セッションが起動されます。セッションのパスは、オブジェクト エクスプローラーで右クリックしたオブジェクトの場所にあらかじめ設定されています。たとえば、オブジェクト エクスプローラーで AdventureWorks2008R2 データベース オブジェクトを右クリックして [PowerShell の起動] をクリックした場合、Windows PowerShell パスは次のように設定されます。

SQLSERVER:\SQL\MyComputer\MyInstance\Databases\AdventureWorks2008R2>

SQL Server エージェントのジョブ ステップでの Windows PowerShell の使用

SQL Server エージェントのジョブ ステップにはいくつかの種類があります。それぞれの種類は、レプリケーション エージェントやコマンド プロンプト環境など、特定の環境を実装するサブシステムに関連付けられています。Windows PowerShell 用の SQL Server エージェント サブシステムは、Windows PowerShell スクリプトを実行するジョブ ステップをサポートします。Windows PowerShell スクリプトのコードを作成した後、SQL Server エージェントを使用して、スケジュールされた時刻に実行されるジョブや SQL Server イベントに応答して実行されるジョブにそのスクリプトを含めることができます。SQL Server エージェント サブシステムは、Windows PowerShell スクリプトを実行できるように、SQL Server スナップインを読み込んで登録します。

詳細については、「SQL Server エージェント サブシステム」を参照してください。

注記注意

それぞれの SQL Server エージェント ジョブ ステップに対し、約 20 MB のメモリを消費する sqlps プロセスが起動されます。大量の Windows PowerShell ジョブ ステップを同時実行すると、パフォーマンスに悪影響が及びます。

Windows PowerShell への SQL Server スナップインの追加

sqlps ユーティリティは、Windows PowerShell のミニシェルです。ミニシェルには特定の制限があります。たとえば、ミニシェルは 1 つ以上の Windows PowerShell スナップインを読み込むようにコーディングされていますが、ユーザーやスクリプトが他のスナップインを追加することはできません。ミニシェルでサポートされていない機能が必要な場合 (SQL Server スナップインと他の製品のスナップインの両方を使用する必要がある場合など) は、SQL Server スナップインを直接 Windows PowerShell 環境に追加することができます。

次のコードをメモ帳に貼り付けて、コンピューターの C:\MyFolder\InitializeSQLProvider.ps1 などの場所に ps1 スクリプト ファイルとして保存します。

# Add the SQL Server Provider.

$ErrorActionPreference = "Stop"

$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")
{
    throw "SQL Server Provider for Windows PowerShell is not installed."
}
else
{
    $item = Get-ItemProperty $sqlpsreg
    $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}


# Set mandatory variables for the SQL Server provider
Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0
Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30
Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false
Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000

# Load the snapins, type data, format data
Push-Location
cd $sqlpsPath
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
Update-TypeData -PrependPath SQLProvider.Types.ps1xml 
update-FormatData -prependpath SQLProvider.Format.ps1xml 
Pop-Location

次に、以下のコマンドを使用して、このスクリプトを使用して SQL Server スナップインを読み込む Windows PowerShell 環境を起動します。

PowerShell -NoExit -Command "C:\MyFolder\InitializeSQLProvider.ps1"

このコマンドは、コマンド プロンプト、デスクトップ ショートカット、または [スタート] メニューの [ファイル名を指定して実行] ダイアログ ボックスから実行できます。既定では、Windows PowerShell は Restricted モードで実行されます。このモードでは、スクリプトの実行はサポートされていません。Windows PowerShell スクリプトの有効化の詳細については、「Windows PowerShell スクリプトの実行」を参照してください。

Windows PowerShell での SQL Server 管理オブジェクトの読み込み

SQL Server 管理オブジェクト (SMO) アセンブリは、SQL Server プロバイダーによって自動的に読み込まれます。ただし、次の 2 つの場合については、直接 SMO アセンブリを読み込む必要があります。

  • スクリプトが、プロバイダーを参照する最初のコマンドまたは SQL Server スナップインのコマンドレットより先に SMO オブジェクトを参照する場合。

  • プロバイダーやコマンドレットを使用しない別の言語 (C#、VB.NET など) から SMO コードを移植する場合。

SMO アセンブリを読み込むコードを次に示します。

# Loads the SQL Server Management Objects (SMO)

$ErrorActionPreference = "Stop"

$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")
{
    throw "SQL Server Provider for Windows PowerShell is not installed."
}
else
{
    $item = Get-ItemProperty $sqlpsreg
    $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}


$assemblylist = 
"Microsoft.SqlServer.Management.Common",
"Microsoft.SqlServer.Smo",
"Microsoft.SqlServer.Dmf ",
"Microsoft.SqlServer.Instapi ",
"Microsoft.SqlServer.SqlWmiManagement ",
"Microsoft.SqlServer.ConnectionInfo ",
"Microsoft.SqlServer.SmoExtended ",
"Microsoft.SqlServer.SqlTDiagM ",
"Microsoft.SqlServer.SString ",
"Microsoft.SqlServer.Management.RegisteredServers ",
"Microsoft.SqlServer.Management.Sdk.Sfc ",
"Microsoft.SqlServer.SqlEnum ",
"Microsoft.SqlServer.RegSvrEnum ",
"Microsoft.SqlServer.WmiEnum ",
"Microsoft.SqlServer.ServiceBrokerEnum ",
"Microsoft.SqlServer.ConnectionInfoExtended ",
"Microsoft.SqlServer.Management.Collector ",
"Microsoft.SqlServer.Management.CollectorEnum",
"Microsoft.SqlServer.Management.Dac",
"Microsoft.SqlServer.Management.DacEnum",
"Microsoft.SqlServer.Management.Utility"


foreach ($asm in $assemblylist)
{
    $asm = [Reflection.Assembly]::LoadWithPartialName($asm)
}

Push-Location
cd $sqlpsPath
update-FormatData -prependpath SQLProvider.Format.ps1xml 
Pop-Location