Tôi nên sử dụng kỹ thuật PowerShell nào để nói chuyện với SQL Server?


29

Cuối cùng tôi muốn sử dụng PowerShell để thay thế các tập lệnh KornShell cũ mà chúng tôi sử dụng cho các trình giám sát phiên bản SQL. Mặc dù vậy, tôi đang có một khoảng thời gian khó khăn, khiến bộ não của tôi xoay quanh tất cả các cách khác nhau mà PowerShell thực sự có thể nói chuyện với máy chủ SQL. Không chắc đây có phải là tất cả không, nhưng đây là 5 cách hoàn toàn khác nhau để tôi có thể truy vấn phiên bản của máy chủ SQL:

1. Lớp SQLConnection .NET

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=MyServer;Database=Master;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "Select @@version as SQLServerVersion"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]

2. Nhà cung cấp WMI

$sqlProperties = Get-WmiObject 
    -computerName "MyServer"
    -namespace root\Microsoft\SqlServer\ComputerManagement10
    -class SqlServiceAdvancedProperty
    -filter "ServiceName = 'MSSQLSERVER'"
$sqlProperties.VERSION

3. SMO

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null
$smo-var = New-Object ('Microsoft.SqlServer.Management.Smo.Server') 'MyServer\instancename'
$smo-var.VersionString

4. PSDrive

Set-Location SQLSERVER:\SQL\MyServerName\
$server = Get-Item Default
$server.get_VersionString()

5. Gọi-SQLCMD

Invoke-Sqlcmd -Query "SELECT @@version" -ServerInstance "MyServer"

Làm thế nào tôi nên đi về việc quyết định sử dụng kỹ thuật nào trong số các kỹ thuật này cho các tình huống khác nhau? Có những ưu / nhược điểm của mỗi? Có phải một số trong số các kỹ thuật powershell 1.0 đã được áp dụng trong 2.0? Một số trong số họ sẽ không hoạt động để giao tiếp với các máy chủ SQL 2000 hoặc 2005?

Ở một cấp độ nào đó, tôi chắc chắn câu trả lời là "sử dụng bất cứ thứ gì hiệu quả", nhưng đối với một người mới biết đến Powershell, thật khó hiểu khi thấy rất nhiều ví dụ được viết như # 1 ở trên, khi đó là dài nhất và (trong suy nghĩ của tôi) ví dụ "giống như sức mạnh".

Thông tin thêm một chút trong trường hợp có liên quan: máy chủ SQL thực sự sẽ chạy các kịch bản giám sát là SQL 2005, nhưng nó được sử dụng để kết nối với nhiều phiên bản từ SQL 2000 đến 2008R2.


1
Trước hết, câu hỏi tuyệt vời và rất kỹ lưỡng. +1. Tôi có lẽ sẽ thu hẹp danh sách này xuống còn hai trong số chúng: ADO.NET (cái đầu tiên của bạn) và SMO. WMI có thể là một chút vụng về và, ngay cả khi nó ít bấm phím hơn, nó không phải là "hiển nhiên" ngay từ cái nhìn đầu tiên những gì sẽ xảy ra.
Thomas Stringer

Câu trả lời:


7

Rõ ràng, rất nhiều điều này phá hủy sự lựa chọn cá nhân đơn giản. Dưới đây là của riêng tôi, cá nhân, hợp lý hóa.

Tôi đã sử dụng Powershell với SQL SQL kể từ PSH v 1.0 và trước khi SQL Server bắt đầu tích hợp chính thức. (Khi tôi bắt đầu với PSH, tôi đang quản trị các máy chủ SQL Server 2000 và 2005.) họ Tôi thường nghiêng về SMO, vì nó làm cho một số thứ dễ dàng hơn nhiều, như kịch bản hóa các đối tượng. Mã riêng của tôi sử dụng SMO một số lần và .Net một số lần. Tôi nghĩ rằng việc sử dụng .Net để lấy các tập kết quả đơn giản chẳng hạn.

Tôi nghĩ rằng Invoke-SQLCMD có ý nghĩa hơn nếu bạn có nhiều tập lệnh TSQL hiện có. Nếu bạn đang tạo các chuỗi và thực thi chúng thông qua -Query, điều đó sẽ trở nên lộn xộn. Nếu bạn nắm rõ cách Powershell hoạt động với .Net và SMO, thỉnh thoảng sử dụng Invoke-SQLCMD, khi bạn có tệp tập lệnh để chạy, thật dễ dàng.

Tôi luôn thấy điều PSDrive thật rắc rối và cảm thấy rằng họ đã triển khai nó vì họ bị cuốn vào ý tưởng "mọi thứ có thể trông giống như một hệ thống tệp". Tôi biết rằng những người * nix thích \ Proc và như vậy, nhưng tôi cảm thấy rằng sự cấy ghép này cảm thấy bị ép buộc. Tôi nghĩ rằng PSDrive vẫn ổn, thậm chí có thể tốt nếu bạn ghét UI, vì đã khám phá mọi thứ nhưng tôi chưa bao giờ viết một tập lệnh sử dụng nó.

Tôi chưa bao giờ thấy ai sử dụng nhà cung cấp WMI. Vì vậy, đó sẽ là lựa chọn cuối cùng của tôi.

Vì vậy, tôi sẽ dẫn đầu với SMO và quay trở lại .Net khi nó thuận tiện hơn.


1
Một điều cần lưu ý Invoke-SQLCmdlà nó không xử lý các kết nối rất duyên dáng. Nếu bạn có một tập lệnh có nhiều truy vấn riêng biệt, các kết nối có thể được duy trì / sử dụng lại hoặc không bị hủy, điều này có thể gây ra sự cố không mong muốn với #TEMPcác bảng nói vẫn tồn tại hoặc các vấn đề về tài nguyên.
JNK

3

4 cho công việc mới, 5 để sử dụng lại các tập lệnh hiện tại hoặc đặt T-SQL có ý nghĩa hơn mã kiểu dựa trên đối tượng / posh. Tôi thích những thứ tốt nhất bởi vì chúng rõ ràng và đơn giản.


2

Tôi có xu hướng nghiêng về sử dụng SQLPS nếu tôi có thể. Nó đơn giản hơn và nếu tôi sử dụng nó trong các tập lệnh thì dễ đọc hơn và ít gõ hơn so với cố gắng sử dụng SMO. SMO có vị trí của nó ở chỗ nó có một chút sức mạnh, nhưng đôi khi có thể gây nhầm lẫn khi sử dụng nếu bạn không quen với nó.

Tôi nghĩ khi các phiên bản SQL Server được phát hành, SQLPS sẽ được cải thiện. Đặc biệt là với SQL Server 2012 SQLPS không phải là mô-đun thay vì là một snapin. Điều này sẽ cho phép Microsoft đưa ra các bản sửa lỗi hoặc cải tiến với SQLPS thông qua các gói dịch vụ hoặc hotfix, thậm chí có thể là CU.

Sau đó, cũng có các dịch vụ cộng đồng như SQLPSX , có rất nhiều mã SMO đã được chuẩn bị cho bạn dưới dạng các lệnh ghép ngắn và các hàm. Mà tôi là tất cả về không phát minh lại bánh xe :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.