sql >> Database teknologi >  >> RDS >> Database

Parse parameterstandardværdier ved hjælp af PowerShell – Del 3

[ 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 derefter Get-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] [[-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}] []

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 ]


  1. Hvad er det bedste værktøj til at sammenligne to SQL Server-databaser (skema og data)?

  2. Udløser udløser ved opdatering af kolonne A eller KolonneB eller KolonneC

  3. Få datoer fra et ugenummer i T-SQL

  4. Sådan sammenlignes datoer i SQL Server