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}
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 :
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: 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.
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.
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