Database
 sql >> Datenbank >  >> RDS >> Database

Parameter-Standardwerte mit PowerShell analysieren – Teil 3

[ Teil 1 | Teil 2 | Teil 3 ]

In Teil 1 und Teil 2 dieser Serie habe ich ParamParser vorgestellt:ein PowerShell-Modul, das beim Analysieren von Parameterinformationen hilft – einschließlich Standardwerten – von gespeicherten Prozeduren und benutzerdefinierten Funktionen, da SQL Server dies nicht für uns tun wird.

In den ersten Iterationen des Codes hatte ich einfach eine .ps1-Datei, mit der Sie einen oder mehrere Modulkörper in eine fest codierte $procedure einfügen konnten Variable. In diesen frühen Versionen hat viel gefehlt, aber wir haben uns bisher mit mehreren Dingen beschäftigt:

  • Es ist jetzt ein richtiges Modul – Sie können Import-Module .\ParamParser.psm1 ausführen und rufen Sie dann Get-ParsedParams auf während einer Sitzung funktionieren (zusätzlich zu den anderen Vorteilen, die Sie aus einem Modul ziehen). Das war keine triviale Umstellung – noch einmal großes Lob an Will White.
  • Unterstützung benutzerdefinierter Funktionen – Ich habe in Teil 2 erklärt, dass Funktionsnamen schwerer zu parsen sind als Prozedurnamen; der Code behandelt dies jetzt ordnungsgemäß.
  • Automatisierung von ScriptDom.dll – wir dürfen diese Schlüsseldatei nicht weitergeben, und weil Sie Probleme bekommen können, wenn Sie sie nicht haben (oder eine veraltete Version haben), hat Will init.ps1 erstellt , wodurch automatisch die neueste Version (derzeit 150.4573.2) heruntergeladen und extrahiert und im selben Ordner wie die anderen Dateien abgelegt wird.
  • Zusätzliche Quellen – Sie können immer noch einen rohen Skriptblock übergeben, wenn Sie möchten, aber jetzt können Sie auch mehrere Instanzen und Datenbanken als Quellen verwenden, auf eine oder mehrere Dateien direkt verweisen oder alle .sql einlesen Dateien aus einem oder mehreren Verzeichnissen. Ich werde unten eine Beispielsyntax zeigen.
  • Ausgabe gibt Quelle an – Da Sie mehrere Dateien oder Datenbanken in einem Aufruf verarbeiten können und möglicherweise mehrere Objekte mit demselben Namen haben, hilft das Einbeziehen der Quelle bei der Unterscheidung. Ich kann nicht viel tun, wenn Sie zwei Instanzen von CREATE PROCEDURE dbo.blat ... haben in der gleichen Datei oder im Rohskript, und die Quelle wird nicht einmal angegeben, wenn Sie -Script verwenden und einen String übergeben.
  • Verbesserte Ausgabe – Sie können immer noch alles auf die Konsole ausgeben, aber Sie können auch Out-GridView verwenden um die Ergebnisse in einem Rasterformat anzuzeigen (hier ist ein langweiliges Beispiel von AdventureWorks2019) oder die Parameterinformationen in einer Datenbank zur Verwendung an anderer Stelle zu protokollieren.

Befolgen Sie zum Herunterladen und Einrichten die Anweisungen in der Readme-Datei. Nachdem Sie das Repository geklont haben, führen Sie .\init.ps1 aus und dann Import-Module .\ParamParser.psm1 . Testen Sie es mit einem einfachen Beispiel wie:

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

Ausgabe (zum Vergrößern anklicken):

Es gibt jedoch auch viele andere Parameterkombinationen. Der Hilfe-Header zeigt einen guten Teil der möglichen Syntax (und nochmals vielen Dank an Will für die erstaunliche Bereinigung hier):

Get-ParsedParams -?

Ergebnisse:

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}] []

Noch ein paar Beispiele

Um alle Objekte in c:\temp\db.sql zu analysieren :

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

Zum Analysieren aller .sql-Dateien in c:\temp\scripts\ (rekursiv) und h:\sql\ (auch rekursiv):

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

Um alle Objekte in msdb zu analysieren auf der lokalen benannten Instanz SQL2019 mit Windows-Authentifizierung:

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

Um alle Objekte in msdb zu analysieren , floob und AdventureWorks2019 auf der lokalen benannten Instanz SQL2019 und Sie werden zur Eingabe der Anmeldeinformationen für die SQL-Authentifizierung aufgefordert:

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

Um alle Objekte in msdb zu analysieren auf der lokalen benannten Instanz SQL2019 und geben Sie die Anmeldedaten für die SQL-Authentifizierung ein:

$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

Zum Analysieren aller .sql-Dateien in c:\temp\scripts\ (rekursiv) und fügen Sie die Ergebnisse in eine Tabelle in der lokalen benannten Instanz SQL2019 ein in einer Datenbank, Utility , wo Sie bereits dbo.ParameterSetTVP erstellt haben , dbo.LogParameters , usw., mit Windows-Authentifizierung:

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

Um alle Objekte in msdb zu analysieren auf der lokalen benannten Instanz SQL2019 und in das Utility schreiben Datenbank auf derselben Instanz mit denselben Anmeldedaten für die SQL-Authentifizierung:

$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

Das wird langsam chaotisch, aber hoffentlich automatisieren Sie das und müssen es nicht jedes Mal von Hand eingeben.

Nächstes Mal

Wie immer können noch weitere Verbesserungen vorgenommen werden. Ich mag die Parameternamen nicht, die ich mir ausgedacht habe, aber ich denke, es gibt wichtigere Verbesserungen, wie Fehlerbehandlung und Erweiterbarkeit, die vorgenommen werden sollten. Irgendwelche Vorschläge? Bitte lassen Sie es mich wissen oder, noch besser, leisten Sie einen Beitrag!

[ Teil 1 | Teil 2 | Teil 3 ]