[ 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.psm1e quindi chiamaGet-ParsedParamsfunzione 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
.sqlfile 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-Scripte passa in una stringa. - Risultato migliorato – puoi ancora scaricare tutto sulla console, ma puoi anche usare
Out-GridViewper 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]Get-ParsedParams [-File]
Get-ParsedParams [-Directory]
Get-ParsedParams [-ServerInstance]
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]