Tập lệnh PowerShell để xác định cơ sở dữ liệu


9

Tôi có đủ kỹ năng PowerShell để khởi đầu, nhưng không có kỹ năng nào với máy chủ SQL. Ai đó có thể vui lòng chỉ cho tôi đúng hướng về cách sử dụng PowerShell để nhận thông tin trên các máy chủ SQL từ xa để xác định cơ sở dữ liệu nào đang chạy trên chúng không.

Cảm ơn vì bất kì sự giúp đỡ.

Chỉnh sửa - Sử dụng mã SMO

Tôi đã cố gắng đặt mã này cùng nhau, nhưng gặp lỗi: Không thể tìm thấy loại [Microsoft.SqlServer.Man Quản lý.Smo.Server] đảm bảo rằng hội đồng chứa loại này đã được tải

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$sqlServer = New-Object("Microsoft.SqlServer.Management.Smo.Server") "MSQLULTDBS04"
foreach($sqlDatabase in $sqlServer.databases) {$sqlDatabase.name}

Tôi đang sử dụng PowerShell v3 - nếu điều đó tạo ra sự khác biệt.
The Woo

Nó sẽ không tạo ra sự khác biệt trên phiên bản PowerShell. Bây giờ tôi đã cập nhật câu trả lời của mình với thông tin bổ sung rằng tôi đã nhận được vào máy tính chứ không phải điện thoại của tôi.

Câu trả lời:


12

Bạn có hai tùy chọn, cả hai tùy chọn này sẽ yêu cầu SQL Server Management Studio được cài đặt trên máy chủ bạn đang chạy các lệnh từ :

  1. SQLPS
  2. SMO

Tôi nghiêng về phía sau vì nó bao gồm định dạng dễ hơn một chút để tìm hiểu cho tác vụ cơ bản, chẳng hạn như lấy danh sách các đối tượng trong một ví dụ.

Với SMO, bạn phải tải các hội đồng thích hợp mà bạn muốn làm việc. Trong hầu hết các trường hợp Microsoft.sqlserver.management.smo.serversẽ là một phổ biến nhất được sử dụng.

Với SQLPS, bạn phải biết phiên bản SQL Server nào bạn đang làm việc. SQL Server 2008 R2 (và R1) bạn sẽ add-pssnapin *sql*và SQL Server 2012 và hơn thế nữa import-module SQLPS.

Bây giờ đến câu hỏi trong tay để có được một danh sách các cơ sở dữ liệu.

Phương pháp SQLPS

dir SQLSERVER:\\SQL\ServerName\Default\Databases | select name

Ở trên sẽ là một thể hiện có tên mặc định, bạn sẽ thay đổi "mặc định" thành tên cá thể của mình nếu đó là một thể hiện được đặt tên.

Phương pháp SMO

$srv = New-Object 'Microsoft.SqlServer.Management.SMO.Server' "myInstance"
$srv.Databases | select name

Bây giờ đoạn mã trên có thể dễ dàng được gói vào một hàm hoặc cho mỗi vòng lặp cho phép bạn dễ dàng chuyển qua nhiều tên máy chủ.

Biên tập

Tùy thuộc vào tài liệu bạn đọc trên PowerShell, bạn sẽ thấy rằng hầu hết mọi người dành thời gian để viết kịch bản, sẽ tiếp tục và dành thời gian để làm cho nó trở thành một tập lệnh lặp lại. Điều này được thực hiện thông qua một chức năng (mức cơ bản đối với tôi) và sau đó là các mô-đun (nâng cao hơn mà tôi chưa chạm tới).

Vì vậy, đối với mã ví dụ của bạn:

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$sqlServer = New-Object("Microsoft.SqlServer.Management.Smo.Server") "MSQLULTDBS04"
foreach($sqlDatabase in $sqlServer.databases) {$sqlDatabase.name}

foreachVòng lặp của bạn là không cần thiết để xuất ra danh sách các cơ sở dữ liệu. Đây là một đối tượng trong SMO chứa nhiều thuộc tính, một trong số đó namevà PowerShell sẽ chỉ xuất ra ở định dạng mặc định, như được hiển thị bên dưới: nhập mô tả hình ảnh ở đây Một điểm khác biệt cần lưu ý giữa SMO và SQLPS ở đây là SQLPS sẽ không xuất cơ sở dữ liệu hệ thống theo mặc định , SMO sẽ.

Nếu bạn tra cứu bài đăng trên Blog trên PowerShell Profiles, một điều phổ biến cần làm là thêm lệnh lắp ráp vào đó để bất cứ khi nào bạn mở lệnh PowerShell, nó đã có sẵn. Sau đó tôi sẽ thêm các hàm về cơ bản là các lệnh tôi sử dụng và tình cờ có một hàm cho cơ sở dữ liệu:

function Get-DBList ($server)
{
    $srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $server
    $srv.Databases | Select name, RecoveryModel, 
        @{Label="CompatibilityLevel";Expression={($_.CompatibilityLevel).ToString().Replace("Version", "")}}
} #end Get-DBList

Bạn có thể sửa đổi điều này theo ý thích của mình nhưng nếu tôi gọi nó bằng cách sử dụng thể hiện cục bộ của mình, tôi nhận được kết quả đầu ra bên dưới. nhập mô tả hình ảnh ở đây

Tôi sẽ đi trước và cho bạn biết một cái gì đó mà tôi đã tìm ra một cách khó khăn. Sử dụng SMO, bạn có thể kết nối với SQL Server 2000 cho đến SQL Server 2014, tuy nhiên, mỗi phiên bản SQL Server có thể khác nhau về vị trí của các thuộc tính cụ thể. Tôi đã có một cuộc trò chuyện học tập với Jonathan Kehayias trên Twitter vào một buổi chiều khi học điều này nhưng tôi không thể nhớ lại tài sản mà tôi đang tìm kiếm. Trong những tình huống này, thư viện lớp .NET trên MSDN cho SMO là bạn của bạn vì nó có thể giúp hướng dẫn bạn đến các thuộc tính bạn đang tìm kiếm.


Cảm ơn rất nhiều cho câu trả lời chi tiết. Tôi thích phương pháp 'SMO', vì các máy chủ là sự kết hợp của năm 2003 và 2008, với các phiên bản khác nhau của SQL Server. Với phương pháp SMO, tên máy chủ đi vào đâu? Có phải là "myInstance"?
The Woo

2

Khi bạn đã nhập mô-đun SQLPS, bạn cũng có thể sử dụng Invoke-SQLcmd , vd

Import-Module SQLPS -DisableNameChecking
Invoke-SQLcmd -Server '.\sql2012' -Database master 'select * from sys.databases' | Format-Table
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.