[ Deel 1 | Deel 2 | Deel 3 ]
In deel 1 en deel 2 van deze serie heb ik ParamParser geïntroduceerd:een PowerShell-module die helpt bij het ontleden van parameterinformatie - inclusief standaardwaarden - van opgeslagen procedures en door de gebruiker gedefinieerde functies, omdat SQL Server het niet voor ons gaat doen.
In de eerste paar iteraties van de code had ik gewoon een .ps1-bestand waarmee je een of meer modulelichamen in een hardgecodeerde $procedure kon plakken variabel. Er ontbrak veel in die vroege versies, maar we hebben tot nu toe verschillende dingen aangepakt:
- Het is nu een echte module – u kunt
Import-Module .\ParamParser.psm1uitvoeren en bel vervolgens deGet-ParsedParamsfunctie gedurende een sessie (naast de andere voordelen die u uit een module haalt). Dit was geen triviale bekering - nogmaals een pluim voor Will White. - Ondersteuning voor door de gebruiker gedefinieerde functies – In deel 2 heb ik uitgelegd hoe functienamen moeilijker te ontleden zijn dan procedurenamen; de code handelt dit nu correct af.
- ScriptDom.dll automatiseren – we mogen dit sleutelbestand niet herdistribueren, en omdat je problemen kunt krijgen als je het niet hebt (of een verouderde versie hebt), heeft Will
init.ps1gemaakt , die automatisch de nieuwste versie downloadt en uitpakt (momenteel 150.4573.2) en deze in dezelfde map plaatst als de andere bestanden. - Aanvullende bronnen – je kunt nog steeds een onbewerkt scriptblok doorgeven als je wilt, maar nu kun je ook meerdere instanties en databases als bronnen gebruiken, rechtstreeks naar een of meer bestanden verwijzen of alle
.sqlintrekken bestanden uit een of meer mappen. Ik zal hieronder enkele voorbeeldsyntaxis laten zien. - Uitvoer geeft bron aan – aangezien u meerdere bestanden of databases in één aanroep kunt verwerken en u meerdere objecten met dezelfde naam kunt hebben, inclusief de bron, helpt het ondubbelzinnig te maken. Ik kan niet veel doen als je twee instanties hebt van
CREATE PROCEDURE dbo.blat ...in hetzelfde bestand of in hetzelfde onbewerkte script, en de bron wordt niet eens aangegeven als je-Script. gebruikt en geef een string door. - Verbeterde output – je kunt nog steeds alles naar de console dumpen, maar je kunt ook
Out-GridViewgebruiken om de resultaten in een rasterformaat te bekijken (hier is een saai voorbeeld van AdventureWorks2019), of log de parameterinformatie in een database voor consumptie elders.
Volg de instructies in de readme om te downloaden en in te stellen. Zodra je de repository hebt gekloond, voer je .\init.ps1 . uit en vervolgens Import-Module .\ParamParser.psm1 . Test het met een eenvoudig voorbeeld, zoals:
Get-ParsedParams -Script "CREER PROCEDURE dbo.a @b int =5 uit AS PRINT 1;" -GridView
Uitvoer (klik om te vergroten):

Er zijn echter ook veel andere parametercombinaties. De help-header toont een groot deel van de mogelijke syntaxis (en nogmaals bedankt aan Will voor veel geweldige opruiming hier):
Get-ParsedParams -?
Resultaten:
Get-ParsedParams [-Script]Get-ParsedParams [-File]
Get-ParsedParams [-Directory]
Get-ParsedParams [-ServerInstance]
Nog een paar voorbeelden
Om alle objecten in c:\temp\db.sql te ontleden :
Get-ParsedParams -File "C:\temp\db.sql" -GridView
Om alle .sql-bestanden in c:\temp\scripts\ te ontleden (recursief) en h:\sql\ (ook recursief):
Get-ParsedParams -Directory "C:\temp\scripts\", "H:\sql\" -GridView
Om alle objecten in msdb te ontleden op de lokale benoemde instantie SQL2019 met behulp van Windows-verificatie:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -GridView
Om alle objecten in msdb te ontleden , floob , en AdventureWorks2019 op de lokale benoemde instantie SQL2019 en wordt gevraagd om de inloggegevens voor SQL-verificatie:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb","floob","AdventureWorks" -AuthenticationMode "SQL" -GridView
Om alle objecten in msdb te ontleden op de lokale benoemde instantie SQL2019 en geef SQL-verificatiegegevens door:
$password =ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"$credential =New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $passwordGet-ParsedParams -ServerInstance" -\SQabase "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -GridView
Om alle .sql-bestanden in c:\temp\scripts\ te ontleden (recursief), en plaats de resultaten in een tabel in de lokale benoemde instantie SQL2019 in een database, Utility , waar u al dbo.ParameterSetTVP . heeft gemaakt , dbo.LogParameters , enz., met behulp van Windows-verificatie:
Get-ParsedParams -Directory "C:\temp\scripts" -LogToDatabase -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility"
Om alle objecten in msdb te ontleden op de lokale benoemde instantie SQL2019 en schrijf naar het Utility database op dezelfde instantie, met dezelfde SQL-verificatiegegevens:
$password =ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"$credential =New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $passwordGet-ParsedParams -ServerInstance" -\SQabase "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -LogToDatabase ` -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility" -LogToDBAuthenticationMode "SQL" -LogToDBSqlCredential $credential Dat begint rommelig te worden, maar hopelijk automatiseer je dit en typ je het niet elke keer met de hand uit.Volgende keer
Zoals altijd zijn er meer verbeteringen mogelijk. Ik hou niet van de parameternamen die ik heb verzonnen, maar ik denk dat er belangrijkere verbeteringen zijn, zoals foutafhandeling en uitbreidbaarheid die moeten worden gedaan. Eventuele suggesties? Laat het me weten of, nog beter, draag bij!
[ Deel 1 | Deel 2 | Deel 3 ]