it-swarm.com.de

PowerShell-Skript zum Identifizieren von Datenbanken

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}
9
The Woo

Sie haben zwei Optionen , 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 einfacher zu erlernendes 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.server wird 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 zu einem wiederholbaren Skript 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 foreach -Schleife wird nicht benötigt, um die Liste der Datenbanken auszugeben. Dies ist ein Objekt in SMO, das mehrere Eigenschaften enthält, von denen eine name ist, und PowerShell gibt diese einfach im Standardformat aus, wie unten gezeigt: enter image description here Ein Unterschied zwischen SMO und SQLPS besteht darin, dass SQLPS die Systemdatenbanken standardmäßig nicht ausgibt, SMO jedoch.

Wenn Sie einen Blog-Beitrag in PowerShell-Profilen nachschlagen, müssen Sie häufig den Befehl Assembly 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. enter image description here

Ich werde weitermachen und Sie über etwas informieren, das ich auf die harte Tour herausgefunden habe. Mit SMO können Sie bis 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 auf MSDN für SMO Ihr Freund, da sie Ihnen helfen kann, zu den Eigenschaften zu gelangen, nach denen Sie suchen.

12
user507

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
2
wBob