Ausführen von SQL Server PowerShell

SQL Server installiert Windows PowerShell und einen Satz von SQL Server-Snap-Ins, die SQL Server-Funktionalität in Windows PowerShell verfügbar machen. Sie können dann Windows PowerShell-Skripts schreiben, die mit SQL Server-Objekten arbeiten. Die Skripts können in der Windows PowerShell-Umgebung, in SQL Server Management Studio und als SQL Server-Agent-Aufträge ausgeführt werden.

Installieren der SQL Server PowerShell-Unterstützung

Sie installieren die für das Ausführen der Windows PowerShell-Skripts erforderliche Software mithilfe des SQL Server-Setups. Ab SQL Server 2008 werden von Setup die folgenden Windows PowerShell-Komponenten installiert, wenn Sie die Clientsoftware oder die Datenbankdienste-Knoten auswählen:

  • Windows PowerShell 1.0, wenn Windows PowerShell noch nicht auf dem Computer vorhanden ist.

  • Die SQL Server-Snap-Ins. Die Snap-Ins sind DLL-Dateien, die zwei Arten der Windows PowerShell-Unterstützung für SQL Server implementieren:

    • Ein Satz von SQL Server-Cmdlets. Cmdlets sind Befehle, die eine bestimmte Aktion implementieren. Beispielsweise führt Invoke-Sqlcmd ein Transact-SQL- oder XQuery-Skript aus, das auch vom sqlcmd-Hilfsprogramm ausgeführt werden kann. Invoke-PolicyEvaluation meldet, ob SQL Server-Objekte den richtlinienbasierten Verwaltungsrichtlinien entsprechen.

    • Ein SQL Server-Anbieter. Mit dem Anbieter können Sie in der Hierarchie der SQL Server-Objekte mithilfe eines Pfads navigieren, der einem Dateisystempfad ähnelt. Jedes Objekt ist einer Klasse der SQL Server Management Object-Modelle zugeordnet. Sie können die Methoden und die Eigenschaften der Klasse zur Arbeit mit den Objekten verwenden. Wenn Sie z. B. cd zu einem Datenbankobjekt in einem Pfad ausführen, können Sie die Methoden und Eigenschaften der Microsoft.SqlServer.Managment.SMO.Database-Klasse verwenden, um die Datenbank zu verwalten.

  • Das sqlps-Hilfsprogramm, das zum Ausführen von Windows PowerShell-Sitzungen verwendet wird, die die SQL Server-Snap-Ins beinhalten.

Ab SQL Server 2008 unterstützt SQL Server Management Studio das Starten von Windows PowerShell-Sitzungen aus der Struktur des Objekt-Explorers. Außerdem unterstützt der SQL Server-Agent ab SQL Server 2008 Windows PowerShell-Auftragsschritte.

Wenn Windows PowerShell nach der Beendigung des Setups deinstalliert wird, sind die SQL Server-Funktionen für Windows PowerShell nicht funktionsfähig. Windows PowerShell kann von Windows-Benutzern deinstalliert werden. Die Deinstallation von Windows PowerShell ist unter Umständen bei einigen Aktualisierungen von Windows-Betriebssystemen erforderlich. Falls Windows PowerShell deinstalliert wurde und Sie die SQL Server-Funktionen verwenden möchten, müssen Sie einen der folgenden Schritte ausführen:

  • Windows PowerShell 1.0 vom Microsoft Download Center manuell herunterladen und neu installieren. Downloadanweisungen finden Sie auf der Windows Server 2003-Website.

  • Wenn Sie Windows Server 2008 ausführen, ist Windows PowerShell 1.0 im Betriebssystem vorhanden, aber standardmäßig deaktiviert. Sie können Windows PowerShell über Windows Server 2008 erneut aktivieren.

Unterstützte SQL Server-Versionen

Sie müssen die SQL Server 2008-Clientkomponenten zum Ausführen von Windows PowerShell verwenden. Windows PowerShell kann Verbindungen mit Instanzen von SQL Server 2000 oder höher herstellen. Die früheste Version von SQL Server 2005, die Sie verwenden können, ist SP2. Die früheste Version von SQL Server 2000, die Sie verwenden können, ist SP4. Wenn Windows PowerShell eine Verbindung mit SQL Server 2005 und SQL Server 2000 herstellt, ist es auf die Funktionalität beschränkt, die in diesen Versionen von SQL Server verfügbar ist.

Verwenden des Hilfsprogramms 'sqlps'

sqlps ist ein Dienstprogramm, das eine Windows PowerShell-Umgebung erstellt und dann die SQL Server-Snap-Ins lädt und registriert. Sie können sqlps für Folgendes verwenden:

  • Interaktives Ausführen von Windows PowerShell-Befehlen

  • Ausführen von Windows PowerShell-Skriptdateien

  • Ausführen von SQL Server-Cmdlets

  • Verwenden Sie die SQL Server-Anbieterpfade, um durch die Hierarchie der SQL Server-Objekte zu navigieren.

Standardmäßig wird sqlps mit auf Restricted festgelegter Skriptausführungsrichtlinie ausgeführt, wodurch die Ausführung von Windows PowerShell-Skripts verhindert wird. Sie können das Set-ExecutionPolicy-Cmdlet verwenden, um die Ausführung signierter Skripts oder beliebiger Skripts zu ermöglichen. Führen Sie nur Skripts aus vertrauenswürdigen Quellen aus, und sichern Sie alle Eingabe- und Ausgabedateien, indem Sie die geeigneten NTFS-Berechtigungen verwenden. Weitere Informationen zum Aktivieren von Windows PowerShell-Skripts finden Sie unter Running Windows PowerShell Scripts.

Weitere Informationen finden Sie unter sqlps (Dienstprogramm).

Verwenden von Windows PowerShell in SQL Server Management Studio

Sie können Windows PowerShell-Sitzungen in SQL Server Management Studio starten, indem Sie im Objekt-Explorer mit der rechten Maustaste auf Objekte klicken und PowerShell starten auswählen. SQL Server Management Studio startet dann eine Windows PowerShell-Sitzung, in der die SQL Server PowerShell-Snap-Ins bereits geladen und registriert sind. Der Pfad für die Sitzung ist auf den Speicherort des Objekts, auf das Sie mit der rechten Maustaste geklickt haben, voreingestellt. Wenn Sie beispielsweise im Objekt-Explorer mit der rechten Maustaste auf das Datenbankobjekt AdventureWorks2008R2 klicken und dann Windows PowerShell starten auswählen, wird der PowerShell-Pfad folgendermaßen festgelegt:

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

Verwenden von Windows PowerShell in SQL Server-Agent-Auftragsschritten

Es gibt mehrere Typen von SQL Server-Agent-Auftragsschritten. Jeder Typ ist einem Subsystem zugeordnet, das eine bestimmte Umgebung implementiert, wie eine Replikations-Agent- oder Eingabeaufforderungsumgebung. Das SQL Server-Agent-Subsystem für Windows PowerShell unterstützt Auftragsschritte, die Windows PowerShell-Skripts ausführen. Sie können Windows PowerShell-Skripts schreiben und die Skripts dann mit dem SQL Server-Agent in Aufträge integrieren, die zu festgelegten Zeiten oder in Reaktion auf SQL Server-Ereignisse ausgeführt werden. Das Subsystem des SQL Server-Agents lädt und registriert die SQL Server-Snap-Ins, so dass Sie Windows PowerShell-Skripts ausführen können.

Weitere Informationen finden Sie unter Subsysteme des SQL Server-Agents.

VorsichtshinweisVorsicht

Jeder Auftragsschritt des SQL Server-Agents startet einen sqlps-Prozess, der etwa 20 MB Arbeitsspeicher in Anspruch nimmt. Die gleichzeitige Ausführung einer großen Anzahl von Windows PowerShell-Auftragsschritten kann sich negativ auf die Leistung auswirken.

Hinzufügen des SQL Server-Snap-Ins in Windows PowerShell

Das sqlps-Dienstprogramm ist eine Windows PowerShell-Mini-Shell. Für Mini-Shells gelten bestimmte Einschränkungen. Sie sind z. B. so codiert, dass sie in ein oder mehrere Windows PowerShell-Snap-Ins geladen werden können. Weitere Snap-Ins können jedoch nicht von Benutzern oder Skripts hinzugefügt werden. Wenn Sie Funktionen benötigen, die nicht von Mini-Shells unterstützt werden, z. B. das Zusammenwirken von SQL Server-Snap-Ins mit Snap-Ins anderer Produkte, können Sie die SQL Server-Snap-Ins direkt in eine Windows PowerShell-Umgebung einfügen.

Kopieren Sie folgenden Code in Editor, und speichern Sie ihn als PS1-Skriptdatei auf dem Computer, z. B. 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

Sie können mithilfe des Skripts die Windows PowerShell-Umgebung starten, in die die SQL Server-Snap-Ins mit diesem Befehl geladen werden:

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

Der Befehl kann über eine Eingabeaufforderung, eine Desktopverknüpfung oder das Dialogfeld Ausführen im Menü Start ausgeführt werden. In der Standardeinstellung wird Windows PowerShell im eingeschränkten Modus ausgeführt, der das Ausführen von Skripts nicht unterstützt. Weitere Informationen zum Aktivieren von Windows PowerShell-Skripts finden Sie unter Running Windows PowerShell Scripts.

Laden von SQL Server Management Objects in Windows PowerShell

Der SQL Server-Anbieter lädt die SQL Server Management Objects-Assemblys (SMO) automatisch. In zwei Szenarien müssen die SMO-Assemblys direkt geladen werden:

  • Das Skript verweist vor dem ersten Befehl, der auf den Anbieter oder die Cmdlets der SQL Server-Snap-Ins verweist, auf ein SMO-Objekt.

  • Sie möchten SMO-Code portieren, der in einer anderen Sprache geschrieben wurde, die weder den Anbieter noch Cmdlets verwendet (z. B. C# oder VB.Net).

Mit folgendem Code werden die SMO-Assemblys geladen:

# 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