[ 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 panggilGet-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]Get-ParsedParams [-File]
Get-ParsedParams [-Directory]
Get-ParsedParams [-ServerInstance]
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 ]