[ Del 1 | Del 2 | Del 3 ]
I del 1 og del 2 af denne serie introducerede jeg ParamParser:et PowerShell-modul, der hjælper med at parse parameterinformation – inklusive standardværdier – fra lagrede procedurer og brugerdefinerede funktioner, fordi SQL Server ikke vil gøre det for os.
I de første par iterationer af koden havde jeg simpelthen en .ps1-fil, der tillod dig at indsætte en eller flere modulkroppe i en hårdkodet $procedure variabel. Der manglede meget i de tidlige versioner, men vi har behandlet flere ting indtil videre:
- Det er nu et ordentligt modul – du kan køre
Import-Module .\ParamParser.psm1og kald derefterGet-ParsedParamsfunktion gennem en session (udover de andre fordele, du får ved et modul). Dette var ikke en triviel konvertering – igen kudos til Will White. - Understøttelse af brugerdefinerede funktioner – Jeg forklarede i del 2, hvordan funktionsnavne er sværere at parse end procedurenavne; koden håndterer nu dette korrekt.
- Automatisering af ScriptDom.dll – vi har ikke lov til at omdistribuere denne nøglefil, og fordi du kan ramme problemer, hvis du ikke har den (eller har en forældet version), har Will oprettet
init.ps1, som automatisk downloader og udpakker den seneste version (p.t. 150.4573.2) og placerer den i samme mappe som de andre filer. - Yderligere kilder – du kan stadig sende en rå scriptblok ind, hvis du vil, men nu kan du også bruge flere instanser og databaser som kilder, referere til en eller flere filer direkte eller trække alle
.sqlind. filer fra en eller flere mapper. Jeg viser nogle eksempler på syntaks nedenfor. - Output angiver kilde – da du kan behandle flere filer eller databaser i et opkald, og du kan have flere objekter med samme navn, inklusive kilden hjælper med at tvetydige. Jeg kan ikke gøre meget, hvis du har to forekomster af
CREATE PROCEDURE dbo.blat ...i samme fil eller rå-script, og kilden er ikke engang angivet, hvis du bruger-Scriptog passere i en snor. - Forbedret output – du kan stadig dumpe alt til konsollen, men du kan også bruge
Out-GridViewfor at se resultaterne i et gitterformat (her er et kedeligt eksempel fra AdventureWorks2019), eller logge parameteroplysningerne til en database til forbrug andetsteds.
Følg instruktionerne i readme for at downloade og konfigurere. Når du har klonet depotet, skal du køre .\init.ps1 og derefter Import-Module .\ParamParser.psm1 . Test det med et simpelt eksempel, som:
Get-ParsedParams -Script "CREATE PROCEDURE dbo.a @b int =5 out AS PRINT 1;" -GridView
Output (klik for at forstørre):

Der er dog også mange andre parameterkombinationer. Hjælpehovedet viser en god del af den mulige syntaks (og igen tak til Will for en masse fantastisk oprydning her):
Get-ParsedParams -?
Resultater:
Get-ParsedParams [-Script]Get-ParsedParams [-File]
Get-ParsedParams [-Directory]
Get-ParsedParams [-ServerInstance]
Et par flere eksempler
At parse alle objekterne i c:\temp\db.sql :
Get-ParsedParams -Fil "C:\temp\db.sql" -GridView
At parse alle .sql-filerne i c:\temp\scripts\ (rekursiv) og h:\sql\ (også rekursivt):
Get-ParsedParams -Directory "C:\temp\scripts\", "H:\sql\" -GridView
At parse alle objekterne i msdb på den lokale navngivne instans SQL2019 bruger Windows-godkendelse:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -GridView
At parse alle objekterne i msdb , floob , og AdventureWorks2019 på den lokale navngivne instans SQL2019 og bliv bedt om SQL-godkendelsesoplysninger:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb","floob","AdventureWorks" -AuthenticationMode "SQL" -GridView
At parse alle objekterne i msdb på den lokale navngivne instans SQL2019 og indsend SQL-godkendelsesoplysninger:
$password =ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"$credential =New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $passwordGet-ParsedParams "09SQLinstances "09Sver"Linstances "0. "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -GridView
At parse alle .sql-filerne i c:\temp\scripts\ (rekursiv), og læg resultaterne i en tabel i den lokale navngivne instans SQL2019 i en database, Utility , hvor du allerede har oprettet dbo.ParameterSetTVP , dbo.LogParameters osv., ved hjælp af Windows-godkendelse:
Get-ParsedParams -Directory "C:\temp\scripts" -LogToDatabase -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility"
At parse alle objekterne i msdb på den lokale navngivne instans SQL2019 og skriv til Utility database på samme forekomst, ved hjælp af de samme SQL-godkendelsesoplysninger:
$password =ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"$credential =New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $passwordGet-ParsedParams "09SQLinstances "09Sver"Linstances "0. "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -LogToDatabase ` -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility" -LogToDBAuthenticationMode "SQL" $lCcredentDial>Det begynder at blive rodet, men forhåbentlig automatiserer du dette og ikke skriver det i hånden hver gang.
Næste gang
Som altid er der flere forbedringer, der kan foretages. Jeg bryder mig ikke om de parameternavne, jeg har fundet på, men jeg synes, der er vigtigere forbedringer, såsom fejlhåndtering og udvidelsesmuligheder, der bør gøres. Nogen forslag? Fortæl mig det eller, endnu bedre, bidrag!
[ Del 1 | Del 2 | Del 3 ]