PowerShell-Skript zum Identifizieren von Datenbanken

9

Ich habe genug PowerShell-Kenntnisse, um mich auf den Weg zu machen, aber keine mit SQL Server. Kann mir bitte jemand die richtige Richtung zeigen, wie PowerShell verwendet wird, um Informationen zu Remote-SQL-Servern abzurufen und festzustellen, welche Datenbanken auf ihnen ausgeführt werden.

Vielen Dank für jede Hilfe.

Bearbeiten - Verwenden von SMO-Code

Ich habe versucht, diesen Code zusammenzusetzen, erhalte jedoch die folgende Fehlermeldung: Typ [Microsoft.SqlServer.Management.Smo.Server] kann nicht gefunden werden. Stellen Sie sicher, dass die Assembly mit diesem Typ geladen ist

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$sqlServer = New-Object("Microsoft.SqlServer.Management.Smo.Server") "MSQLULTDBS04"
foreach($sqlDatabase in $sqlServer.databases) {$sqlDatabase.name}
Das Woo
quelle
Ich verwende PowerShell v3 - wenn das einen Unterschied macht.
The Woo
Bei der PowerShell-Version macht dies keinen Unterschied. Ich habe meine Antwort mit zusätzlichen Informationen aktualisiert, nachdem ich an einen Computer und nicht an mein Telefon gelangt bin.

Antworten:

12

Sie haben zwei Möglichkeiten, für die SQL Server Management Studio auf dem Host installiert sein muss, auf dem Sie die Befehle ausführen :

  1. SQLPS
  2. SMO

Ich neige zu Letzterem, weil es ein etwas einfacheres Format für grundlegende Aufgaben wie das Abrufen einer Liste von Objekten in einer Instanz enthält.

Mit SMO müssen Sie die entsprechenden Assemblys laden, mit denen Sie arbeiten möchten. In den meisten Fällen Microsoft.sqlserver.management.smo.serverwird am häufigsten verwendet.

Mit SQLPS müssen Sie wissen, mit welcher Version von SQL Server Sie arbeiten. SQL Server 2008 R2 (und R1) werden Sie add-pssnapin *sql*und SQL Server 2012 und darüber hinaus werden Sie import-module SQLPS.

Nun zur Frage nach einer Liste von Datenbanken.

SQLPS-Methode

dir SQLSERVER:\\SQL\ServerName\Default\Databases | select name

Das Obige gilt für eine benannte Standardinstanz. Sie würden "Standard" in Ihren Instanznamen ändern, wenn es sich um eine benannte Instanz handelt.

SMO-Methode

$srv = New-Object 'Microsoft.SqlServer.Management.SMO.Server' "myInstance"
$srv.Databases | select name

Jetzt kann der obige Code einfach in eine Funktion oder für jede Schleife eingeschlossen werden, mit der Sie problemlos mehrere Servernamen übergeben können.

Bearbeiten

Abhängig davon, welche Literatur Sie in PowerShell lesen, werden Sie feststellen, dass die meisten Leute, die sich Zeit nehmen, um ein Skript zu schreiben, die Zeit darauf verwenden, es wiederholbar zu machen. Dies geschieht entweder über eine Funktion (Grundstufe für mich) und dann über Module (fortgeschrittener, die ich noch nicht berührt habe).

Also für Ihren Beispielcode:

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$sqlServer = New-Object("Microsoft.SqlServer.Management.Smo.Server") "MSQLULTDBS04"
foreach($sqlDatabase in $sqlServer.databases) {$sqlDatabase.name}

Ihre foreachSchleife wird nicht benötigt, um die Liste der Datenbanken auszugeben. Dies ist ein Objekt in SMO, das mehrere Eigenschaften enthält. Eine davon ist, nameund PowerShell gibt diese einfach im Standardformat aus, wie unten gezeigt: Geben Sie hier die Bildbeschreibung ein Ein Unterschied zwischen SMO und SQLPS besteht darin, dass SQLPS die Systemdatenbanken standardmäßig nicht ausgibt , SMO wird.

Wenn Sie einen Blog-Beitrag in PowerShell-Profilen nachschlagen, müssen Sie häufig den Assembly-Befehl hinzufügen, damit er bei jedem Öffnen Ihres PowerShell-Befehls bereits verfügbar ist. Ich werde dann Funktionen hinzufügen, die im Grunde Befehle sind, die ich oft benutze, und zufällig eine für Datenbanken haben:

function Get-DBList ($server)
{
    $srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $server
    $srv.Databases | Select name, RecoveryModel, 
        @{Label="CompatibilityLevel";Expression={($_.CompatibilityLevel).ToString().Replace("Version", "")}}
} #end Get-DBList

Sie können dies nach Ihren Wünschen ändern, aber wenn ich es mit meiner lokalen Instanz aufrufe, erhalte ich die folgende Ausgabe. Geben Sie hier die Bildbeschreibung ein

Ich werde weitermachen und Sie über etwas informieren, das ich auf die harte Tour herausgefunden habe. Mit SMO können Sie bis zu SQL Server 2014 eine Verbindung zu SQL Server 2000 herstellen. Jede Version von SQL Server kann jedoch variieren, je nachdem, wo sich bestimmte Eigenschaften befinden. Ich hatte eines Nachmittags ein Lerngespräch mit Jonathan Kehayias auf Twitter, aber ich kann mich nicht erinnern, nach welcher Immobilie ich gesucht habe. In diesen Situationen ist die .NET-Klassenbibliothek in MSDN für SMO Ihr Freund, da sie Ihnen dabei helfen kann, die gewünschten Eigenschaften zu finden.


quelle
Vielen Dank für die ausführliche Antwort. Ich mag die 'SMO'-Methode, da die Server eine Mischung aus 2003 und 2008 sind, mit unterschiedlichen Versionen von SQL Server. Wohin geht bei der SMO-Methode der Servername? Ist es "myInstance"?
The Woo
2

Sobald Sie das SQLPS-Modul importiert haben, können Sie auch Invoke-SQLcmd verwenden , z

Import-Module SQLPS -DisableNameChecking
Invoke-SQLcmd -Server '.\sql2012' -Database master 'select * from sys.databases' | Format-Table
wBob
quelle