web-dev-qa-db-fra.com

Script PowerShell pour identifier les bases de données

J'ai suffisamment de compétences PowerShell pour démarrer, mais je n'en ai aucune avec SQL Server. Quelqu'un peut-il m'indiquer dans la bonne direction comment utiliser PowerShell pour obtenir des informations sur les serveurs SQL distants afin d'identifier les bases de données qui s'exécutent sur eux.

Merci pour toute aide.

Modifier - Utiliser le code SMO

J'ai essayé de rassembler ce code, mais j'obtiens l'erreur: Impossible de trouver le type [Microsoft.SqlServer.Management.Smo.Server] assurez-vous que l'assembly contenant ce type est chargé

[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

Vous avez deux options, qui nécessiteront toutes deux l'installation de SQL Server Management Studio sur l'hôte à partir duquel vous exécutez les commandes :

  1. SQLPS
  2. SMO

Je penche vers ce dernier car il comprend un format un peu plus facile à apprendre pour les tâches de base telles que l'obtention d'une liste d'objets dans une instance.

Avec SMO, vous devez charger les assemblys avec lesquels vous souhaitez travailler. Dans la plupart des cas Microsoft.sqlserver.management.smo.server sera le plus utilisé.

Avec SQLPS, vous devez savoir avec quelle version de SQL Server vous travaillez. SQL Server 2008 R2 (et R1), vous add-pssnapin *sql* et SQL Server 2012 et au-delà, vous import-module SQLPS.

Passons maintenant à la question de l'obtention d'une liste de bases de données.

Méthode SQLPS

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

Ce qui précède serait pour une instance nommée par défaut, vous changeriez "par défaut" en votre nom d'instance s'il s'agissait d'une instance nommée.

Méthode SMO

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

Maintenant, le code ci-dessus peut facilement être encapsulé dans une fonction ou pour chaque boucle qui vous permettrait de passer facilement plusieurs noms de serveur.

Modifier

Selon la littérature que vous lisez sur PowerShell, vous constaterez que la plupart des gens qui prennent du temps pour écrire un script iront de l'avant et passeront du temps à le rendre reproductible. Cela se fait soit à travers une fonction (niveau basique pour moi) puis des modules (plus avancés que je n'ai pas encore touchés).

Donc, pour votre exemple de code:

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

Votre boucle foreach n'est pas nécessaire pour afficher la liste des bases de données. Il s'agit d'un objet dans SMO qui contient plusieurs propriétés, dont name et PowerShell affichera simplement cela au format par défaut, comme indiqué ci-dessous: enter image description here Une différence à noter entre SMO et SQLPS ici est que SQLPS ne sortirait pas les bases de données système par défaut, SMO le fera.

Si vous recherchez un article de blog sur les profils PowerShell, une opération courante consiste à ajouter la commande Assembly à chaque fois que vous ouvrez votre commande PowerShell, elle est déjà disponible. J'ajouterai ensuite des fonctions qui sont essentiellement des commandes que j'utilise souvent, et il se trouve que j'en ai une pour les bases de données:

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

Vous pouvez le modifier à votre guise, mais si je l'appelle en utilisant mon instance locale, j'obtiens la sortie ci-dessous. enter image description here

Je vais aller de l'avant et vous faire savoir quelque chose que j'ai découvert à la dure. À l'aide de SMO, vous pouvez vous connecter à SQL Server 2000 jusqu'à SQL Server 2014, cependant, chaque version de SQL Server peut varier selon l'emplacement des propriétés particulières. Un après-midi, j'ai eu une conversation d'apprentissage avec Jonathan Kehayias sur Twitter, mais je ne me souviens pas de la propriété que je cherchais. Dans ces situations, la bibliothèque de classes .NET sur MSDN pour SMO est votre amie car elle peut vous guider vers les propriétés que vous recherchez.

12
user507

Une fois que vous avez importé le module SQLPS, vous pouvez également utiliser Invoke-SQLcmd , par exemple

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