运行 SQL Server PowerShell

SQL Server 安装程序可安装 Windows PowerShell 和一组用来公开 Windows PowerShell 中 SQL Server 功能的 SQL Server 管理单元。之后,您可以对 Windows PowerShell 脚本进行编码,使其能够处理 SQL Server 对象。脚本可以在 Windows PowerShell 环境和 SQL Server Management Studio 中运行,也可以作为 SQL Server 代理作业来运行。

安装 SQL Server PowerShell 支持

可以使用 SQL Server 安装程序来安装运行 Windows PowerShell 脚本所必需的软件。自 SQL Server 2008 开始,当您选择客户端软件或“数据库服务”节点时,安装程序会安装下面的 Windows PowerShell 组件:

  • Windows PowerShell 1.0(如果计算机上尚且没有 Windows PowerShell)。

  • SQL Server 管理单元。这些管理单元是 dll 文件,可用来实现两种类型的 SQL Server Windows PowerShell 支持:

    • 一组 SQL Server cmdlet。Cmdlet 是用来实现特定操作的命令。例如,Invoke-Sqlcmd 可用于运行 Transact-SQL 或 XQuery 脚本(而这些脚本也可使用 sqlcmd 实用工具运行),而 Invoke-PolicyEvaluation 可用于报告 SQL Server 对象是否符合基于策略的管理策略。

    • SQL Server 提供程序。通过该提供程序,可以使用类似于文件系统路径的路径,在 SQL Server 对象的层次结构中导航。每个对象都与 SQL Server 管理对象模型中的一个类关联。您可以使用该类的方法和属性来针对对象执行工作。例如,如果通过 cd 切换到路径中的某个数据库对象,则可以使用 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 操作系统升级可能会要求卸载 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。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 cmdlet。

  • 使用 SQL Server 提供程序路径可以浏览 SQL Server 对象的层次结构。

默认情况下,sqlps 会在脚本执行策略设置为 Restricted(即,禁止运行任何 Windows PowerShell 脚本)的情况下运行。您可以使用 Set-ExecutionPolicy cmdlet 来运行已签名脚本或任意脚本。请仅运行来自受信任源的脚本,并通过使用适当的 NTFS 权限来保证所有输入和输出文件的安全。有关启用 Windows PowerShell 脚本的详细信息,请参阅 Running Windows PowerShell Scripts(运行 Windows PowerShell 脚本)。

有关详细信息,请参阅 sqlps 实用工具

在 SQL Server Management Studio 中使用 Windows PowerShell

可以通过在对象资源管理器中右键单击所需的对象并选择**“启动 PowerShell”,在 SQL Server Management Studio 中启动 Windows 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 代理子系统将加载和注册 SQL Server 管理单元,以便您可以运行 Windows PowerShell 脚本。

有关详细信息,请参阅 SQL Server 代理子系统

注意事项注意

每个 SQL Server 代理作业步骤都会启动一个 sqlps 进程,每个进程将占用大约 20 MB 内存。运行大量的并发 Windows PowerShell 作业步骤会对性能产生负面影响。

向 Windows PowerShell 添加 SQL Server 管理单元

sqlps 实用工具是 Windows PowerShell 的微型外壳程序。微型外壳程序具有一定的限制。例如,它们编码为加载到一个或多个 Windows PowerShell 管理单元中,但用户和脚本不能添加其他管理单元。如果您需要使用微型外壳程序不支持的功能,例如同时使用 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 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

然后,您就可以使用该脚本来启动 Windows PowerShell 环境,在该环境中使用以下命令加载 SQL Server 管理单元:

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

该命令可在命令提示符下运行,也可从桌面快捷方式运行,或者从**“开始”菜单中的“运行”对话框运行。默认情况下,Windows PowerShell 在限制**模式下运行,该模式不支持运行脚本。有关启用 Windows PowerShell 脚本的详细信息,请参阅 Running Windows PowerShell Scripts(运行 Windows PowerShell 脚本)。

在 Windows PowerShell 中加载 SQL Server 管理对象

SQL Server 提供程序自动加载 SQL Server 管理对象 (SMO) 程序集。有两种情况可能需要您直接加载 SMO 程序集:

  • 脚本在从 SQL Server 管理单元引用该提供程序或 cmdlet 的第一个命令之前引用了一个 SMO 对象。

  • 您需要从不使用该提供程序或 cmdlet 的另一种语言(例如 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