Powershell ?
Un langage de script digne successeur de nos commandes DOS.
Sa parfaite intégration avec l'OS d'une part, certaines applications telles SQLServer devrait simplifier l'écriture de batchs.
Où se trouve-t-il ?
Je ne parlerai ici que de la version fournie avec SQLServer 2008 qui est mon domaine.
On peut le lancer en mode commande ici :
C:\Program Files\Microsoft SQL Server\100\Tools\Binn
Ou depuis pas mal d'endroits depuis SSMS :
Et clic droit :
Qui nous donne une bonne vieille fenêtre en mode commande :
Nous sommes ici sous mon instance nommée (SQL2008) comme le montre cette requête :
Pour en voir les bases de données , rien de plus simple :
Bon, faire des DIR, c'est joli, mais le scripting ?
Le mélange OS/SQLServer permet plein de possibilités :
Par exemple :
net stop "SQL Server Agent (Test2008)"
net stop "SQL Server (Test2008)"
Attention ! les $ démarrent des variables en POWERShell, donc
net stop 'MSSQL$SQL2000'
Les simples quotes signifiant : ne cherche pas à analyser cette chaine, prend la telle quelle … subtil, mais il m'a fallu quelque temps pour trouver la parade !
Je viens de parler des variables, très simples à utiliser :
$Instance2000="SQLSERVER:\SQL\"+$MachineName+"\SQL2000"
Concatène 3 chaines de caractères dont une variable.
Ecriture standard de commande :
PS parle de cmdlet (petites commandes) qui sont toujours sous la forme
Verbe-complément
Par exemple : Write-host
Voici quelques cas standard que j'ai eu à résoudre :
Positionnement sur une instance SQLServer :
$Instance2000="SQLSERVER:\SQL\"+$MachineName+"\SQL2000"
# --- Instance nommée SQL2000
set-location $Instance2000
A partir de cet instant on peut soumettre des requêtes :
Requêtes à la volée :
A partir de constante :
invoke-sqlcmd -Query "sp_addserver '$MachineName\SQL2000', local"
A partir de fichier script .SQL :
invoke-sqlcmd -InputFile "c:\MonRepertoire\ModifierPerms.sql"
Attention : la documentation est erronée (au jour où je poste ceci) et parle de QueryFile…
$SuppLogins= "USE master " +
"DROP LOGIN [$MachineName\Pierre] " +
"DROP LOGIN [$MachineName\Paul] " +
"DROP LOGIN Alan "
invoke-sqlcmd -Query $SuppLogins
Qui mélange PS et le langage SQL.
Travail sur fichiers :
if (Test-path "d:\MSSQL10.SQL2008\mssql\data\MaBase.mdf") {Remove-item "d:\MSSQL10.SQL2008\mssql\data\MaBase.mdf"}
Qui supprime le fihcier s'il existe.
Copy-item "c:\Fichiers\MaBase.mdf" "d:\MSSQL10.TEST2008\mssql\data"
Copie toujours (écrasé si présent) le fichier vers la cible.
Remove-item "h:\Sauvegardes\BasesSQL2008\*.*" –recurse
Supprime à ce niveau et dans les sous niveaux.
Renvoi de messages console :
Write-host "Base créée"
A noter que l'on peut colorier (voir la syntaxe de cette commande par help Write-host)
Travail sur les process :
$ProcessActifs = Get-process
foreach ($Process in $ProcessActifs)
{
if ($Process.ProcessName -eq "ssms") {Stop-process -name "ssms"}
}
On voit ici un parcours de la collection des process de la machine et suppression d'un des process.
# Attente SQLServer
Start-sleep -s 5
Attente de 5 secondes pour permettre au service SQL de démarrer…
Soumission de scripts :
Toutes ces commandes peuvent être entregistrées dans des fichiers .ps1 et soumise grâce à SQLPS en ligne de commande.
Conclusion :
Je pensais avant d'utiliser cet outil : 'encore un langage à apprendre !'
En réalité le rapport temps d'apprentissage/ gain de de développement est très favorable !
Tous ceux qui ont des tâches répétitives :
DBA, consultants, fournisseurs de solutions …
apprécieront cet outil.