Ausführen von SQL Server PowerShell

SQL Server 2008 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-Unterstützung

Sie installieren die für das Ausführen der Windows PowerShell-Skripts erforderliche Software mithilfe des SQL Server-Setups. Das SQL Server 2008-Setup installiert die folgenden Windows PowerShell-Komponenten, 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-Dienstprogramm 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 an 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-Dienstprogramm, das zum Ausführen von Windows PowerShell-Sitzungen, die die SQL Server-Snap-Ins enthalten, verwendet wird.

Die SQL Server 2008-Version von SQL Server Management Studio unterstützt das Starten von Windows PowerShell-Sitzungen aus der Strukturansicht des Objekt-Explorers. Die SQL Server 2008-Version des SQL Server-Agents unterstützt Windows PowerShell-Auftragsschritte.

Wenn Windows PowerShell nach der Beendigung des Setups deinstalliert wird, funktionieren die SQL Server-Features für Windows PowerShell nicht. Windows PowerShell kann von Windows-Benutzern deinstalliert werden. Die Deinstallation von Windows PowerShell ist unter Umständen bei einigen Aktualisierungen von Windows-Betriebssystemen erforderlich. Wenn Windows PowerShell deinstalliert wurde und Sie die SQL Server-Features für Windows PowerShell 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 2003Website.

  • 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 SQL Server-Features für Windows PowerShell verwenden. Der SQL Server-Anbieter für Windows PowerShell kann Verbindungen mit Instanzen von SQL Server 2008, SQL Server 2005 oder SQL Server 2000 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 der SQL Server-Anbieter eine Verbindung mit SQL Server 2005 und SQL Server 2000 herstellt, ist sie auf die Funktionalität beschränkt, die in diesen Versionen von SQL Server verfügbar ist.

Verwenden des Dienstprogramms '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-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 AdventureWorks klicken und dann PowerShell starten auswählen, wird der Windows PowerShell-Pfad folgendermaßen festgelegt:

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

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 Windows PowerShell-Subsystem des SQL Server-Agents 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 als Antwort auf SQL Server-Ereignisse ausgeführt werden. Das Windows PowerShell-Subsystem des SQL Server-Agents lädt und registriert die SQL Server-Snap-Ins, sodass Sie Windows PowerShell-Skripts ausführen können.

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

VorsichtshinweisVorsicht

Jeder Windows PowerShell-Auftragsschritt des SQL Server-Agents startet einen sqlps-Prozess, der etwa 20 MB Speicher 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. Arbeiten mit SQL Server-Snap-Ins und den Snap-Ins anderer Produkte, können Sie die SQL Server-Snap-Ins direkt in eine Windows PowerShell-Umgebung hinzufügen.

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

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 automatisch die SQL Server Management Objects-Assemblys (SMO). 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 importieren, 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 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

Änderungsverlauf

Aktualisierter Inhalt

Der Abschnitt zum Verwenden der Windows PowerShell-Umgebung wurde gelöscht. Es wurden zwei neue Abschnitte hinzugefügt: "Hinzufügen des SQL Server-Snap-Ins in Windows PowerShell" und "Laden von SQL Server Management Objects in Windows PowerShell".