Database
 sql >> Base de données >  >> RDS >> Database

Analyser les valeurs par défaut des paramètres à l'aide de PowerShell - Partie 3

[ Partie 1 | Partie 2 | Partie 3 ]

Dans les parties 1 et 2 de cette série, j'ai présenté ParamParser :un module PowerShell qui aide à analyser les informations sur les paramètres - y compris les valeurs par défaut - des procédures stockées et des fonctions définies par l'utilisateur, car SQL Server ne le fera pas pour nous.

Dans les premières itérations du code, j'avais simplement un fichier .ps1 qui vous permettait de coller un ou plusieurs corps de module dans une $procedure codée en dur variable. Il manquait beaucoup de choses dans ces premières versions, mais nous avons résolu plusieurs choses jusqu'à présent :

  • C'est maintenant un véritable module – vous pouvez exécuter Import-Module .\ParamParser.psm1 puis appelez le Get-ParsedParams fonctionner tout au long d'une session (en plus des autres avantages que vous obtenez d'un module). Ce n'était pas une conversion triviale – félicitations encore à Will White.
  • Prise en charge des fonctions définies par l'utilisateur – J'ai expliqué dans la partie 2 comment les noms de fonction sont plus difficiles à analyser que les noms de procédure; le code gère maintenant cela correctement.
  • Automatisation de ScriptDom.dll – nous ne sommes pas autorisés à redistribuer ce fichier clé, et parce que vous pouvez rencontrer des problèmes si vous ne l'avez pas (ou si vous avez une version obsolète), Will a créé init.ps1 , qui télécharge et extrait automatiquement la dernière version (actuellement 150.4573.2) et la place dans le même dossier que les autres fichiers.
  • Sources supplémentaires – vous pouvez toujours transmettre un bloc de script brut si vous le souhaitez, mais vous pouvez désormais également utiliser plusieurs instances et bases de données comme sources, référencer directement un ou plusieurs fichiers ou extraire tous les .sql fichiers d'un ou plusieurs répertoires. Je vais montrer quelques exemples de syntaxe ci-dessous.
  • La sortie indique la source – puisque vous pouvez traiter plusieurs fichiers ou bases de données en un seul appel, et que vous pouvez avoir plusieurs objets portant le même nom, dont la source aide à lever l'ambiguïté. Je ne peux pas faire grand-chose si vous avez deux instances de CREATE PROCEDURE dbo.blat ... dans le même fichier ou script brut, et la source n'est même pas indiquée si vous utilisez -Script et passer dans une chaîne.
  • Sortie améliorée – vous pouvez toujours tout vider sur la console, mais vous pouvez également utiliser Out-GridView pour afficher les résultats dans un format de grille (voici un exemple ennuyeux d'AdventureWorks2019), ou enregistrer les informations de paramètre dans une base de données pour une consommation ailleurs.

Suivez les instructions du fichier Lisez-moi pour télécharger et configurer. Une fois que vous avez cloné le référentiel, exécutez .\init.ps1 puis Import-Module .\ParamParser.psm1 . Testez-le avec un exemple simple, comme :

Get-ParsedParams -Script "CREATE PROCEDURE dbo.a @b int = 5 out AS PRINT 1;" -GridView

Sortie (cliquez pour agrandir) :

Il existe également de nombreuses autres combinaisons de paramètres. L'en-tête de l'aide montre une bonne partie de la syntaxe possible (et merci encore à Will pour son incroyable nettoyage ici) :

Get-ParsedParams -?

Résultats :

Get-ParsedParams [-Script] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode] {SQL | Windows}] []

Get-ParsedParams [-File] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode ] {SQL | Windows}] []

Get-ParsedParams [-Directory] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode ] {SQL | Windows}] []

Get-ParsedParams [-ServerInstance] [-Database] [[-AuthenticationMode] {SQL | Windows}] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode] {SQL | Windows}] []

Quelques exemples supplémentaires

Pour analyser tous les objets dans c:\temp\db.sql :

Get-ParsedParams -File "C:\temp\db.sql" -GridView

Pour analyser tous les fichiers .sql dans c:\temp\scripts\ (récursif) et h:\sql\ (aussi récursif) :

Get-ParsedParams -Directory "C:\temp\scripts\", "H:\sql\" -GridView

Pour analyser tous les objets dans msdb sur l'instance nommée locale SQL2019 en utilisant l'authentification Windows :

Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -GridView

Pour analyser tous les objets dans msdb , floob , et AdventureWorks2019 sur l'instance nommée locale SQL2019 et obtenez des informations d'identification d'authentification SQL :

Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb","floob","AdventureWorks" -AuthenticationMode "SQL" -GridView

Pour analyser tous les objets dans msdb sur l'instance nommée locale SQL2019 et transmettez les identifiants d'authentification SQL :

$password = ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"
$credential = New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $password
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -GridView

Pour analyser tous les fichiers .sql dans c:\temp\scripts\ (récursif), et mettre les résultats dans une table dans l'instance locale nommée SQL2019 dans une base de données, Utility , où vous avez déjà créé dbo.ParameterSetTVP , dbo.LogParameters , etc., en utilisant l'authentification Windows :

Get-ParsedParams -Directory "C:\temp\scripts" -LogToDatabase -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility"

Pour analyser tous les objets dans msdb sur l'instance nommée locale SQL2019 et écrivez dans l'Utility base de données sur la même instance, en utilisant les mêmes identifiants d'authentification SQL :

$password = ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"
$credential = New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $password
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -LogToDatabase ` 
                 -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility" -LogToDBAuthenticationMode "SQL" -LogToDBSqlCredential $credential

Cela commence à devenir désordonné, mais j'espère que vous automatisez cela et que vous ne le tapez pas à la main à chaque fois.

La prochaine fois

Comme toujours, d'autres améliorations peuvent être apportées. Je n'aime pas les noms de paramètres que j'ai trouvés, mais je pense qu'il y a des améliorations plus importantes, telles que la gestion des erreurs et l'extensibilité qui devraient être faites. Aucune suggestion? Faites-le moi savoir ou, mieux encore, contribuez !

[ Partie 1 | Partie 2 | Partie 3 ]