Share via


執行 SQL Server PowerShell

SQL Server 2008 會安裝 Windows PowerShell 以及可在 Windows PowerShell 中公開 SQL Server 功能的一組 SQL Server 嵌入式管理單元。然後,您可以編碼處理 SQL Server 物件的 Windows PowerShell 指令碼。這些指令碼可以在 Windows PowerShell 環境中、SQL Server Management Studio 中及當做 SQL Server Agent 作業來執行。

安裝 SQL Server 支援

您會使用 SQL Server 安裝程式來安裝執行 Windows PowerShell 指令碼所需的軟體。當您選取用戶端軟體或 Database Services 節點時,SQL Server 2008 安裝程式會安裝以下 Windows PowerShell 元件:

  • Windows PowerShell 1.0 (如果電腦上沒有 Windows PowerShell)。

  • SQL Server 嵌入式管理單元。這些嵌入式管理單元是可實作 SQL Server 之兩種 Windows PowerShell 支援的 dll 檔案:

    • 一組 SQL Server 指令程式。指令程式是實作特定動作的命令。例如,Invoke-Sqlcmd 會執行可透過使用 sqlcmd 公用程式來執行的 Transact-SQL 或 XQuery 指令碼,而且 Invoke-PolicyEvaluation 會報告 SQL Server 物件是否符合以原則為基礎的管理原則。

    • SQL Server 提供者。此提供者可讓您使用類似於檔案系統路徑的路徑來導覽 SQL Server 物件階層。每一個物件都與 SQL Server 管理物件模型中的類別有關聯。您可以使用此類別的方法和屬性來針對物件執行工作。例如,如果您執行 cd 切換到路徑中的資料庫物件,您可以使用 Microsoft.SqlServer.Managment.SMO.Database 類別的方法和屬性來管理資料庫。

  • 用來執行 Windows PowerShell 工作階段的 sqlps 公用程式 (該工作階段包含 SQL Server 嵌入式管理單元)。

SQL Server 2008 版的 SQL Server Management Studio 可支援從 [物件總管] 樹狀結構來啟動 Windows PowerShell 工作階段。SQL Server 2008 版的 SQL Server Agent 可支援 Windows PowerShell 作業步驟。

如果在安裝程式完成後解除安裝 Windows PowerShell,則適用於 Windows PowerShell 的 SQL Server 功能將無法運作。Windows PowerShell 可以由 Windows 使用者解除安裝,而且某些 Windows 作業系統升級可能也會要求解除安裝 Windows PowerShell。如果 Windows PowerShell 已解除安裝,而您想要使用適用於 Windows PowerShell 的 SQL Server 功能,則必須進行下列其中一項作業:

  • 從 Microsoft 下載中心手動下載 Windows PowerShell 1.0 並加以重新安裝。下載指示可在Windows Server 2003網站 (英文) 上找到。

  • 如果您執行的是 Windows Server 2008,則 Windows PowerShell 1.0 已存在作業系統中,但預設為停用。您可以從 Windows Server 2008 重新啟用 Windows PowerShell。

支援的 SQL Server 版本

您必須使用 SQL Server 2008 用戶端元件來執行適用於 Windows PowerShell 的 SQL Server 功能。適用於 Windows PowerShell 的 SQL Server 提供者可以連接至 SQL Server 2008、SQL Server 2005 或 SQL Server 2000 的執行個體。您可以使用的最舊 SQL Server 2005 版本是 SP2。您可以使用的最舊 SQL Server 2000 版本是 SP4。當 SQL Server 提供者連接至 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 嵌入式管理單元的 Windows PowerShell 工作階段。此工作階段的路徑會預設為您在 [物件總管] 中按一下滑鼠右鍵之物件的位置。例如,如果您以滑鼠右鍵按一下 [物件總管] 中的 AdventureWorks 資料庫物件,並選取 [啟動 PowerShell] 時,Windows PowerShell 路徑會設定為以下內容:

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

在 SQL Server Agent 作業步驟中使用 Windows PowerShell

SQL Server Agent 作業步驟有好幾種類型。每一個類型都與可實作特定環境的子系統有關,例如複寫代理程式或命令提示字元環境。SQL Server Agent Windows PowerShell 子系統可支援用來執行 Windows PowerShell 指令碼的作業步驟。您可以編寫 Windows PowerShell 指令碼,然後使用 SQL Server Agent,在排程時間執行的作業內包含這些指令碼,或是用來回應 SQL Server 事件。SQL Server Agent Windows PowerShell 子系統會載入及註冊 SQL Server 嵌入式管理單元,好讓您可以執行 Windows PowerShell 指令碼。

如需詳細資訊,請參閱<SQL Server Agent 子系統>。

警告注意事項警告

每個 SQL Server Agent Windows PowerShell 作業步驟都會啟動大約耗用 20 MB 記憶體的 sqlps 處理序。執行大量並行 Windows PowerShell 作業步驟可能會對效能造成負面影響。

將 SQL Server 嵌入式管理單元加入到 Windows PowerShell

sqlps 公用程式是一種 Windows PowerShell 迷你 Shell。迷你 Shell 有某些限制,例如,編寫它們是為了載入一個或多個 Windows PowerShell 嵌入式管理單元中,但是使用者和指令碼無法新增其他嵌入式管理單元。如果您要求的功能不受到迷你 Shell 所支援 (例如同時使用 SQL Server 嵌入式管理單元及另一個產品中的嵌入式管理單元),您可以直接將 SQL Server 嵌入式管理單元加入到 Windows PowerShell 環境中。

將下列程式碼貼到 [記事本] 中,並將它儲存為電腦上的 ps1 指令碼檔案,例如 C:\MyFolder\InitializeSQLProvider.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 is not installed."
}
else
{
    $item = Get-ItemProperty $sqlpsreg
    $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}


# Set mandatory variables for the SQL Server rovider
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 提供者會自動載入 SQL Server 管理物件 (SMO) 組件。有兩種情況您可能必須直接載入 SMO 組件:

  • 如果您的指令碼在第一個命令之前先參考 SMO 物件,而該命令會從 SQL Server 嵌入式管理單元參考提供者或指令程式。

  • 您想要從不使用提供者或指令程式的另一個語言移植 SMO 程式碼 (例如 C# 或 VB.Net)。

下列程式碼會載入 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 is not installed."
}
else
{
    $item = Get-ItemProperty $sqlpsreg
    $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}


$assemblylist = 
"Microsoft.SqlServer.Smo",
"Microsoft.SqlServer.Dmf ",
"Microsoft.SqlServer.SqlWmiManagement ",
"Microsoft.SqlServer.ConnectionInfo ",
"Microsoft.SqlServer.SmoExtended ",
"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"


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

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

變更記錄

更新的內容

已刪除「使用 Windows PowerShell 環境」一節。已新增兩個章節:「將 SQL Server 嵌入式管理單元加入到 Windows PowerShell」和「在 Windows PowerShell 中載入 SQL Server 管理物件」。