[ 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.psm1
uitvoeren en bel vervolgens deGet-ParsedParams
functie 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.ps1
gemaakt , 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
.sql
intrekken 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-GridView
gebruiken 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 ]