[ Del 1 | Del 2 | Del 3 ]
I del 1 och del 2 av denna serie introducerade jag ParamParser:en PowerShell-modul som hjälper till att analysera parameterinformation – inklusive standardvärden – från lagrade procedurer och användardefinierade funktioner, eftersom SQL Server inte kommer att göra det åt oss.
I de första iterationerna av koden hade jag helt enkelt en .ps1-fil som gjorde att du kunde klistra in en eller flera modulkroppar i en hårdkodad $procedure
variabel. Det saknades mycket i de tidiga versionerna, men vi har tagit upp flera saker hittills:
- Det är nu en riktig modul – du kan köra
Import-Module .\ParamParser.psm1
och anropa sedanGet-ParsedParams
fungera under en session (utöver de andra fördelarna du får av en modul). Detta var inte en trivial omvandling – kudos igen till Will White. - Stöd för användardefinierade funktioner – Jag förklarade i del 2 hur funktionsnamn är svårare att tolka än procedurnamn; koden hanterar nu detta korrekt.
- Automatisera ScriptDom.dll – vi får inte omdistribuera den här nyckelfilen, och eftersom du kan stöta på problem om du inte har den (eller har en föråldrad version), skapade Will
init.ps1
, som automatiskt hämtar och extraherar den senaste versionen (för närvarande 150.4573.2) och placerar den i samma mapp som de andra filerna. - Ytterligare källor – du kan fortfarande skicka in ett råskriptblock om du vill, men nu kan du också använda flera instanser och databaser som källor, referera till en eller flera filer direkt eller dra in alla
.sql
filer från en eller flera kataloger. Jag ska visa några exempel på syntax nedan. - Utdata anger källa – eftersom du kan behandla flera filer eller databaser i ett anrop, och du kan ha flera objekt med samma namn, inklusive källan hjälper till att disambiguera. Jag kan inte göra mycket om du har två instanser av
CREATE PROCEDURE dbo.blat ...
i samma fil eller råskript, och källan anges inte ens om du använder-Script
och passera i ett snöre. - Förbättrad utdata – du kan fortfarande dumpa allt till konsolen, men du kan också använda
Out-GridView
för att se resultaten i ett rutnätsformat (här är ett tråkigt exempel från AdventureWorks2019), eller logga parameterinformationen till en databas för konsumtion någon annanstans.
Följ instruktionerna i readme för att ladda ner och konfigurera. När du har klonat förvaret, kör .\init.ps1
och sedan Import-Module .\ParamParser.psm1
. Testa det med ett enkelt exempel, som:
Get-ParsedParams -Script "SKAPA PROCEDUR dbo.a @b int =5 out AS PRINT 1;" -GridView
Utdata (klicka för att förstora):
Det finns dock många andra parameterkombinationer också. Hjälphuvudet visar en bra bit av den möjliga syntaxen (och tack igen till Will för många fantastiska rensningar här):
Get-ParsedParams -?
Resultat:
Get-ParsedParams [-Script]Get-ParsedParams [-File]
Get-ParsedParams [-Directory]
Get-ParsedParams [-ServerInstance]
Några fler exempel
Att analysera alla objekt i c:\temp\db.sql
:
Get-ParsedParams -Fil "C:\temp\db.sql" -GridView
Att analysera alla .sql-filer i c:\temp\scripts\
(rekursiv) och h:\sql\
(även rekursiv):
Get-ParsedParams -Katalog "C:\temp\scripts\", "H:\sql\" -GridView
För att analysera alla objekt i msdb
på den lokala namngivna instansen SQL2019
med Windows-autentisering:
Get-ParsedParams -ServerInstance ".\SQL2019" -Databas "msdb" -GridView
För att analysera alla objekt i msdb
, floob
och AdventureWorks2019
på den lokala namngivna instansen SQL2019
och bli tillfrågad om SQL-autentiseringsuppgifter:
Get-ParsedParams -ServerInstance ".\SQL2019" -Databas "msdb","floob","AdventureWorks" -AuthenticationMode "SQL" -GridView
För att analysera alla objekt i msdb
på den lokala namngivna instansen SQL2019
och skicka in SQL-autentiseringsuppgifter:
$password =ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"$credential =New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $passwordGet-ParsedParams -SerQInstances "09SQLinstances "09SerDatabas" "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -GridView
Att analysera alla .sql-filer i c:\temp\scripts\
(rekursiv) och lägg resultaten i en tabell i den lokala namngivna instansen SQL2019
i en databas, Utility
, där du redan har skapat dbo.ParameterSetTVP
, dbo.LogParameters
, etc., med Windows-autentisering:
Get-ParsedParams -Katalog "C:\temp\scripts" -LogToDatabase -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility"
För att analysera alla objekt i msdb
på den lokala namngivna instansen SQL2019
och skriv till Utility
databas på samma instans, med samma SQL-autentiseringsuppgifter:
$password =ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"$credential =New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $passwordGet-ParsedParams -SerQInstances "09SQLinstances "09SerDatabas" "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -LogToDatabase ` -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility" -LogToDBAuthenticationMode "SQL" $lCcredentDial>Det börjar bli rörigt, men förhoppningsvis automatiserar du det här och inte skriver det för hand varje gång.
Nästa gång
Som alltid finns det fler förbättringar som kan göras. Jag gillar inte parameternamnen jag har kommit på, men jag tycker att det finns viktigare förbättringar, som felhantering och utökbarhet som bör göras. Några förslag? Meddela mig eller, ännu bättre, bidra!
[ Del 1 | Del 2 | Del 3 ]