Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Parsing nilai default parameter menggunakan PowerShell – Bagian 3

[ Bagian 1 | Bagian 2 | Bagian 3 ]

Di bagian 1 dan bagian 2 dari seri ini, saya memperkenalkan ParamParser:modul PowerShell yang membantu mengurai informasi parameter – termasuk nilai default – dari prosedur tersimpan dan fungsi yang ditentukan pengguna, karena SQL Server tidak akan melakukannya untuk kita.

Dalam beberapa iterasi pertama kode, saya hanya memiliki file .ps1 yang memungkinkan Anda untuk menempelkan satu atau lebih badan modul ke dalam $procedure hard-coded variabel. Ada banyak hal yang hilang dalam versi awal tersebut, tetapi sejauh ini kami telah membahas beberapa hal:

  • Sekarang menjadi modul yang tepat – Anda dapat menjalankan Import-Module .\ParamParser.psm1 lalu panggil Get-ParsedParams berfungsi sepanjang sesi (selain manfaat lain yang Anda dapatkan dari modul). Ini bukan konversi sepele – pujian lagi untuk Will White.
  • Dukungan Fungsi Buatan Pengguna – Saya menjelaskan di bagian 2 bagaimana nama fungsi lebih sulit diuraikan daripada nama prosedur; kode sekarang menangani ini dengan benar.
  • Mengotomatiskan ScriptDom.dll – kami tidak diizinkan untuk mendistribusikan ulang file kunci ini, dan karena Anda dapat mengalami masalah jika Anda tidak memilikinya (atau memiliki versi lama), Akan membuat init.ps1 , yang secara otomatis mengunduh dan mengekstrak versi terbaru (saat ini 150.4573.2) dan menempatkannya di folder yang sama dengan file lainnya.
  • Sumber tambahan – Anda masih dapat memasukkan blok skrip mentah jika Anda mau, tetapi sekarang Anda juga dapat menggunakan beberapa instance dan database sebagai sumber, merujuk satu atau lebih file secara langsung, atau menarik semua .sql file dari satu atau lebih direktori. Saya akan menunjukkan beberapa contoh sintaks di bawah ini.
  • Keluaran menunjukkan sumber – karena Anda dapat memproses beberapa file atau database dalam satu panggilan, dan Anda mungkin memiliki beberapa objek dengan nama yang sama, termasuk sumber yang membantu memperjelas. Saya tidak bisa berbuat banyak jika Anda memiliki dua contoh CREATE PROCEDURE dbo.blat ... dalam file atau skrip mentah yang sama, dan sumber bahkan tidak ditunjukkan jika Anda menggunakan -Script dan lulus dalam string.
  • Keluaran yang ditingkatkan – Anda masih dapat membuang semuanya ke konsol, tetapi Anda juga dapat menggunakan Out-GridView untuk melihat hasil dalam format petak (berikut contoh membosankan dari AdventureWorks2019), atau mencatat informasi parameter ke database untuk konsumsi di tempat lain.

Ikuti petunjuk di readme untuk mengunduh dan menyiapkan. Setelah Anda mengkloning repositori, jalankan .\init.ps1 lalu Import-Module .\ParamParser.psm1 . Uji dengan contoh sederhana, seperti:

Get-ParsedParams -Script "CREATE PROCEDURE dbo.a @b int = 5 out AS PRINT 1;" -GridView

Keluaran (klik untuk memperbesar):

Ada banyak kombinasi parameter lain juga. Header bantuan menunjukkan sebagian besar kemungkinan sintaks (dan sekali lagi terima kasih kepada Will untuk banyak pembersihan luar biasa di sini):

Get-ParsedParams -?

Hasil:

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

Beberapa contoh lagi

Untuk mengurai semua objek di c:\temp\db.sql :

Get-ParsedParams -File "C:\temp\db.sql" -GridView

Untuk mengurai semua file .sql di c:\temp\scripts\ (rekursif) dan h:\sql\ (juga rekursif):

Get-ParsedParams -Directory "C:\temp\scripts\", "H:\sql\" -GridView

Untuk mengurai semua objek di msdb pada instance bernama lokal SQL2019 menggunakan otentikasi Windows:

Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -GridView

Untuk mengurai semua objek di msdb , floob , dan AdventureWorks2019 pada instance bernama lokal SQL2019 dan dapatkan permintaan untuk kredensial Otentikasi SQL:

Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb","floob","AdventureWorks" -AuthenticationMode "SQL" -GridView

Untuk mengurai semua objek di msdb pada instance bernama lokal SQL2019 dan berikan kredensial Otentikasi SQL:

$password = ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"
$credential = New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $password
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -GridView

Untuk mengurai semua file .sql di c:\temp\scripts\ (rekursif), dan masukkan hasilnya ke dalam tabel di instance lokal bernama SQL2019 dalam database, Utility , tempat Anda telah membuat dbo.ParameterSetTVP , dbo.LogParameters , dll., menggunakan Otentikasi Windows:

Get-ParsedParams -Directory "C:\temp\scripts" -LogToDatabase -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility"

Untuk mengurai semua objek di msdb pada instance bernama lokal SQL2019 dan tulis ke Utility database pada instance yang sama, menggunakan kredensial Otentikasi SQL yang sama:

$password = ConvertTo-SecureString -AsPlainText -Force -String "Str0ngP@ssw0rd"
$credential = New-Object -TypeName "PSCredential" -ArgumentList "SQLAuthUsername", $password
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -AuthenticationMode "SQL" -SqlCredential $credential -LogToDatabase ` 
                 -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility" -LogToDBAuthenticationMode "SQL" -LogToDBSqlCredential $credential

Itu mulai berantakan, tetapi mudah-mudahan Anda mengotomatiskan ini, dan tidak mengetiknya dengan tangan setiap saat.

Lain kali

Seperti biasa, ada lebih banyak perbaikan yang bisa dilakukan. Saya tidak suka nama parameter yang saya buat, tetapi saya pikir ada peningkatan yang lebih penting, seperti penanganan kesalahan dan ekstensibilitas yang harus dilakukan. Ada saran? Tolong beri tahu saya atau, lebih baik lagi, berkontribusi!

[ Bagian 1 | Bagian 2 | Bagian 3 ]


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bersenang-senang dengan Fitur Postgres Baru Django

  2. Serialisasi Penghapusan Dari Indeks Columnstore Clustered

  3. Mengganti Nama Basis Data Pluggable

  4. Pentingnya Garis Dasar

  5. Menganalisis kematian dengan seribu pemotongan beban kerja