sql >> Database >  >> RDS >> Database

Standaardwaarden van parameters parseren met PowerShell - Deel 3

[ 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 de Get-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] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode] {SQL | Windows}] []

Get-ParsedParams [-File] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode ] {SQL | Windows}] []

Get-ParsedParams [-Directory] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode ] {SQL | Windows}] []

Get-ParsedParams [-ServerInstance] [-Database] [[-AuthenticationMode] {SQL | Windows}] [[-GridView]] [[-Console]] [[-LogToDatabase]] [[-LogToDBAuthenticationMode] {SQL | Windows}] []

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 ]


  1. Java - zoek de eerste oorzaak van een uitzondering

  2. Verwijzend naar sessievariabelen (\set var='value') uit PL/PGSQL

  3. Voeg meerdere rijen in met PDO voorbereide verklaringen

  4. Stel sleutel/waarde-paren in in de sessiecontext in SQL Server (sp_set_session_context)