[ 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.psm1
og kald derefterGet-ParsedParams
funktion 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
.sql
ind. 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-Script
og passere i en snor. - Forbedret output – du kan stadig dumpe alt til konsollen, men du kan også bruge
Out-GridView
for 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 ]