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

Analizza i valori predefiniti dei parametri usando PowerShell – Parte 3

[ Parte 1 | Parte 2 | Parte 3]

Nella parte 1 e nella parte 2 di questa serie, ho introdotto ParamParser:un modulo di PowerShell che aiuta ad analizzare le informazioni sui parametri:compresi i valori predefiniti, da stored procedure e funzioni definite dall'utente, perché SQL Server non lo farà per noi.

Nelle prime iterazioni del codice, avevo semplicemente un file .ps1 che ti permetteva di incollare uno o più corpi dei moduli in una $procedure hardcoded variabile. Mancava molto in quelle prime versioni, ma finora abbiamo affrontato diverse cose:

  • Ora è un modulo vero e proprio – puoi eseguire Import-Module .\ParamParser.psm1 e quindi chiama Get-ParsedParams funzione durante una sessione (oltre agli altri vantaggi che ottieni da un modulo). Questa non è stata una conversione banale – complimenti ancora a Will White.
  • Supporto per le funzioni definite dall'utente – Ho spiegato nella parte 2 come i nomi delle funzioni siano più difficili da analizzare rispetto ai nomi delle procedure; il codice ora lo gestisce correttamente.
  • Automatizzazione di ScriptDom.dll – non siamo autorizzati a ridistribuire questo file chiave e, poiché puoi riscontrare problemi se non lo hai (o hai una versione obsoleta), Will ha creato init.ps1 , che scarica ed estrae automaticamente l'ultima versione (attualmente 150.4573.2) e la inserisce nella stessa cartella degli altri file.
  • Fonti aggiuntive – puoi comunque passare un blocco di script non elaborato, se lo desideri, ma ora puoi anche utilizzare più istanze e database come sorgenti, fare riferimento direttamente a uno o più file o inserire tutti i .sql file da una o più directory. Mostrerò alcuni esempi di sintassi di seguito.
  • L'output indica la fonte – poiché puoi elaborare più file o database in una chiamata e potresti avere più oggetti con lo stesso nome, incluso l'origine aiuta a chiarire le ambiguità. Non posso fare molto se hai due istanze di CREATE PROCEDURE dbo.blat ... nello stesso file o script non elaborato, e la fonte non è nemmeno indicata se usi -Script e passa in una stringa.
  • Risultato migliorato – puoi ancora scaricare tutto sulla console, ma puoi anche usare Out-GridView per visualizzare i risultati in un formato griglia (ecco un esempio noioso da AdventureWorks2019) o registrare le informazioni sui parametri in un database per il consumo altrove.

Segui le istruzioni nel file Leggimi per scaricare e configurare. Dopo aver clonato il repository, esegui .\init.ps1 e poi Import-Module .\ParamParser.psm1 . Provalo con un semplice esempio, come:

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

Output (clicca per ingrandire):

Ci sono anche molte altre combinazioni di parametri, però. L'intestazione della guida mostra una buona parte della possibile sintassi (e grazie ancora a Will per la straordinaria pulizia qui):

Get-ParsedParams -?

Risultati:

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

Alcuni esempi

Per analizzare tutti gli oggetti in c:\temp\db.sql :

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

Per analizzare tutti i file .sql in c:\temp\scripts\ (ricorsivo) e h:\sql\ (anche ricorsivo):

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

Per analizzare tutti gli oggetti in msdb sull'istanza denominata locale SQL2019 utilizzando l'autenticazione di Windows:

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

Per analizzare tutti gli oggetti in msdb , floob e AdventureWorks2019 sull'istanza denominata locale SQL2019 e vengono richieste le credenziali di autenticazione SQL:

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

Per analizzare tutti gli oggetti in msdb sull'istanza denominata locale SQL2019 e passare le credenziali di autenticazione 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

Per analizzare tutti i file .sql in c:\temp\scripts\ (ricorsivo) e inserisci i risultati in una tabella nell'istanza denominata locale SQL2019 in un database, Utility , dove hai già creato dbo.ParameterSetTVP , dbo.LogParameters , ecc., utilizzando l'autenticazione di Windows:

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

Per analizzare tutti gli oggetti in msdb sull'istanza denominata locale SQL2019 e scrivi a Utility database sulla stessa istanza, utilizzando le stesse credenziali di autenticazione 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

Inizia a diventare disordinato, ma si spera che tu lo stia automatizzando e non lo digiti a mano ogni volta.

La prossima volta

Come sempre, ci sono ulteriori miglioramenti che possono essere apportati. Non mi piacciono i nomi dei parametri che ho inventato, ma penso che ci siano miglioramenti più importanti, come la gestione degli errori e l'estendibilità che dovrebbero essere fatti. Eventuali suggerimenti? Per favore fatemelo sapere o, meglio ancora, contribuite!

[ Parte 1 | Parte 2 | Parte 3]