[Phần 1 | Phần 2 | Phần 3]
Trong phần 1 và phần 2 của loạt bài này, tôi đã giới thiệu ParamParser:một mô-đun PowerShell giúp phân tích thông tin tham số - bao gồm các giá trị mặc định - từ các thủ tục được lưu trữ và các hàm do người dùng xác định, bởi vì SQL Server sẽ không làm điều đó cho chúng tôi.
Trong vài lần lặp lại mã đầu tiên, tôi chỉ đơn giản có một tệp .ps1 cho phép bạn dán một hoặc nhiều thân mô-đun vào một $procedure
được mã hóa cứng Biến đổi. Còn thiếu rất nhiều điều trong các phiên bản đầu tiên đó, nhưng chúng tôi đã giải quyết một số điều cho đến nay:
- Bây giờ nó là một mô-đun thích hợp - bạn có thể chạy
Import-Module .\ParamParser.psm1
và sau đó gọiGet-ParsedParams
hoạt động trong suốt một phiên (ngoài những lợi ích khác mà bạn nhận được từ một mô-đun). Đây không phải là một chuyển đổi tầm thường - lại kudo cho Will White. - Hỗ trợ chức năng do người dùng xác định - Tôi đã giải thích trong phần 2 cách tên hàm khó phân tích cú pháp hơn tên thủ tục; mã bây giờ xử lý điều này đúng cách.
- Tự động hóa ScriptDom.dll - chúng tôi không được phép phân phối lại tệp khóa này và vì bạn có thể gặp sự cố nếu bạn không có nó (hoặc có phiên bản lỗi thời), Sẽ tạo
init.ps1
, tự động tải xuống và trích xuất phiên bản mới nhất (hiện tại là 150.4573.2) và đặt nó vào cùng thư mục với các tệp khác. - Nguồn bổ sung - bạn vẫn có thể chuyển vào khối tập lệnh thô nếu muốn, nhưng giờ đây bạn cũng có thể sử dụng nhiều phiên bản và cơ sở dữ liệu làm nguồn, tham chiếu trực tiếp một hoặc nhiều tệp hoặc lấy tất cả
.sql
các tệp từ một hoặc nhiều thư mục. Tôi sẽ hiển thị một số cú pháp ví dụ bên dưới. - Đầu ra cho biết nguồn - vì bạn có thể xử lý nhiều tệp hoặc cơ sở dữ liệu trong một lần gọi và bạn có thể có nhiều đối tượng có cùng tên, bao gồm cả nguồn giúp phân biệt. Tôi không thể làm được gì nhiều nếu bạn có hai trường hợp
CREATE PROCEDURE dbo.blat ...
trong cùng một tệp hoặc tập lệnh thô và nguồn thậm chí không được chỉ ra nếu bạn sử dụng-Script
và chuyển vào một chuỗi. - Đầu ra được cải thiện - bạn vẫn có thể kết xuất mọi thứ vào bảng điều khiển, nhưng bạn cũng có thể sử dụng
Out-GridView
để xem kết quả ở định dạng lưới (đây là một ví dụ nhàm chán từ AdventureWorks2019) hoặc ghi thông tin tham số vào cơ sở dữ liệu để sử dụng ở nơi khác.
Làm theo hướng dẫn trong readme để tải xuống và thiết lập. Khi bạn đã nhân bản kho lưu trữ, hãy chạy .\init.ps1
rồi đến Import-Module .\ParamParser.psm1
. Kiểm tra nó bằng một ví dụ đơn giản, như:
Get-ParsedParams -Script "CREATE PROCEDURE dbo.a @b int = 5 out AS PRINT 1;" -GridView
Đầu ra (bấm để phóng to):
Tuy nhiên, có rất nhiều kết hợp tham số khác. Tiêu đề trợ giúp hiển thị một đoạn tốt cú pháp có thể có (và một lần nữa cảm ơn Will vì đã có rất nhiều thao tác dọn dẹp tuyệt vời ở đây):
Get-ParsedParams -?
Kết quả:
Get-ParsedParams [-Script]Get-ParsedParams [-File]
Get-ParsedParams [-Directory]
Get-ParsedParams [-ServerInstance]
Một vài ví dụ khác
Để phân tích cú pháp tất cả các đối tượng trong c:\temp\db.sql
:
Get-ParsedParams -File "C:\temp\db.sql" -GridView
Để phân tích cú pháp tất cả các tệp .sql trong c:\temp\scripts\
(đệ quy) và h:\sql\
(cũng đệ quy):
Get-ParsedParams -Directory "C:\temp\scripts\", "H:\sql\" -GridView
Để phân tích cú pháp tất cả các đối tượng trong msdb
trên phiên bản có tên cục bộ SQL2019
sử dụng xác thực Windows:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb" -GridView
Để phân tích cú pháp tất cả các đối tượng trong msdb
, floob
và AdventureWorks2019
trên phiên bản có tên cục bộ SQL2019
và được nhắc về thông tin xác thực SQL:
Get-ParsedParams -ServerInstance ".\SQL2019" -Database "msdb","floob","AdventureWorks" -AuthenticationMode "SQL" -GridView
Để phân tích cú pháp tất cả các đối tượng trong msdb
trên phiên bản có tên cục bộ SQL2019
và chuyển thông tin xác thực 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
Để phân tích cú pháp tất cả các tệp .sql trong c:\temp\scripts\
(đệ quy) và đặt kết quả vào một bảng trong phiên bản có tên cục bộ SQL2019
trong cơ sở dữ liệu, Utility
, nơi bạn đã tạo dbo.ParameterSetTVP
, dbo.LogParameters
, v.v., bằng Xác thực Windows:
Get-ParsedParams -Directory "C:\temp\scripts" -LogToDatabase -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility"
Để phân tích cú pháp tất cả các đối tượng trong msdb
trên phiên bản có tên cục bộ SQL2019
và ghi vào Utility
cơ sở dữ liệu trên cùng một phiên bản, sử dụng cùng thông tin xác thực 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 -LogToDatabase ` -LogToDBServerInstance ".\SQL2019" -LogToDBDatabase "Utility" -LogToDBAuthenticationMode "SQL" -LogToDBSqlCredential $credential
Điều đó bắt đầu trở nên lộn xộn, nhưng hy vọng bạn đang tự động hóa việc này và không phải gõ nó bằng tay mọi lúc.
Lần sau
Như mọi khi, có nhiều cải tiến hơn có thể được thực hiện. Tôi không thích tên tham số mà tôi nghĩ ra, nhưng tôi nghĩ rằng có nhiều cải tiến quan trọng hơn, chẳng hạn như xử lý lỗi và khả năng mở rộng cần được thực hiện. Bất kỳ đề xuất? Vui lòng cho tôi biết hoặc tốt hơn là đóng góp!
[Phần 1 | Phần 2 | Phần 3]