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