Teknik PowerShell mana yang harus saya gunakan untuk berbicara dengan SQL Server?

29

Saya akhirnya ingin menggunakan PowerShell untuk menggantikan skrip KornShell lama yang kami gunakan untuk monitor contoh SQL. Saya mengalami kesulitan, meskipun, mendapatkan otak saya di semua cara yang berbeda bahwa PowerShell benar-benar dapat berbicara dengan SQL server. Tidak yakin apakah ini semua dari mereka, tetapi di sini ada 5 cara yang sama sekali berbeda saya dapat meminta versi dari server SQL:

1. SQLConnection .NET Class

$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. Penyedia 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. Invoke-SQLCMD

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

Bagaimana saya harus memutuskan teknik mana yang akan digunakan untuk skenario yang berbeda? Apakah ada pro / kontra dari masing-masing? Apakah beberapa teknik PowerShell 1.0 yang diunggulkan di 2.0? Akankah beberapa dari mereka tidak bekerja untuk berkomunikasi dengan server SQL 2000 atau 2005?

Pada satu tingkat, saya yakin jawabannya adalah "gunakan apa pun yang berhasil", tetapi bagi seseorang yang baru mengenal Powershell, sangat membingungkan untuk melihat begitu banyak contoh yang ditulis seperti # 1 di atas, ketika itu adalah yang terpanjang dan (dalam pikiran saya) paling tidak Contoh "mirip tenaga".

Info sedikit lebih banyak dalam hal itu relevan: server SQL yang benar-benar akan menjalankan skrip monitor adalah SQL 2005, tetapi digunakan untuk terhubung ke beberapa contoh dari SQL 2000 hingga 2008R2.

BradC
sumber
1
Pertama, pertanyaan bagus dan sangat teliti. +1. Saya mungkin mempersempit daftar ini menjadi dua di antaranya: ADO.NET (yang pertama), dan SMO. WMI bisa sedikit canggung dan, bahkan jika kurang penekanan tombol itu tidak begitu "jelas" pada pandangan pertama apa yang akan terjadi.
Thomas Stringer

Jawaban:

7

Jelas, banyak dari ini beralih ke pilihan pribadi yang sederhana. Inilah rasionalisasi pribadi saya.

Saya telah menggunakan Powershell dengan SQL SQL sejak PSH v 1.0, dan sebelum SQL Server mulai mengintegrasikannya secara resmi. (Ketika saya mulai dengan PSH, saya mengelola SQL Server 2000 dan 2005 server) mereka. Saya biasanya condong ke SMO, karena itu membuat beberapa hal jauh lebih mudah, seperti scripting objek. Kode saya sendiri menggunakan SMO beberapa kali dan .Net beberapa kali. Saya pikir ini lebih mudah untuk menggunakan. Net untuk mendapatkan set hasil yang sederhana, misalnya.

Saya pikir Invoke-SQLCMD lebih masuk akal jika Anda memiliki banyak skrip TSQL yang ada. Jika Anda membuat string dan mengeksekusinya melalui -Query, itu akan berantakan. Jika Anda memiliki pemahaman yang baik tentang bagaimana Powershell bekerja dengan .Net dan SMO, menggunakan Invoke-SQLCMD sesekali, ketika Anda memiliki file skrip untuk dijalankan, itu mudah.

Saya selalu menemukan hal PSDrive kikuk dan merasa bahwa mereka menerapkannya karena mereka terjebak dalam ide "semuanya bisa terlihat seperti sistem file". Saya tahu bahwa * nix guys menyukai \ proc dan semacamnya, tetapi saya merasa bahwa penerapan ini terasa agak dipaksakan. Saya pikir PSDrive baik-baik saja, bahkan mungkin bagus jika Anda membenci UI, untuk menjelajahi sesuatu tetapi saya belum pernah menulis skrip yang menggunakannya.

Saya belum pernah melihat orang menggunakan penyedia WMI. Jadi, itu akan menjadi pilihan terakhir saya.

Jadi, saya akan memimpin dengan SMO dan kembali ke .Net saat ini sedang ditangani.

selat darin
sumber
1
Sesuatu yang perlu diingat Invoke-SQLCmdadalah ia tidak menangani koneksi dengan sangat anggun. Jika Anda memiliki skrip dengan banyak kueri yang terpisah, koneksi dapat dipertahankan / digunakan kembali atau tidak dijatuhkan yang dapat menyebabkan masalah tak terduga dengan katakanlah #TEMPtabel tetap ada, atau masalah sumber daya.
JNK
3

4 untuk pekerjaan baru, 5 untuk menggunakan kembali skrip yang ada atau tempat T-SQL lebih masuk akal daripada kode gaya berbasis objek / mewah. Saya suka yang terbaik karena jelas dan sederhana.

onupdatecascade
sumber
2

Saya cenderung cenderung menggunakan SQLPS jika saya bisa. Ini lebih sederhana dan jika saya menggunakannya dalam skrip lebih mudah dibaca dan kurang mengetik daripada mencoba menggunakan SMO. SMO memiliki tempatnya karena memiliki kekuatan yang bagus, tetapi terkadang membingungkan untuk digunakan jika Anda tidak terbiasa dengannya.

Saya pikir sebagai versi SQL Server dirilis SQLPS akan diperbaiki. Terutama karena dengan SQL Server 2012 SQLPS tidak modular bukannya menjadi snapin. Ini akan memungkinkan Microsoft untuk mendorong perbaikan atau peningkatan dengan SQLPS melalui paket layanan atau perbaikan terbaru, bahkan mungkin CU.

Lalu ada juga penawaran komunitas seperti SQLPSX , yang memiliki banyak kode SMO yang sudah disiapkan untuk Anda sebagai cmdlet dan fungsi. Yang saya semua tentang tidak menciptakan kembali roda :)

Shawn Melton
sumber