SQL Server ile konuşmak için hangi PowerShell tekniğini kullanmalıyım?


29

Sonuçta SQL örneği izleyiciler için kullandığımız eski KornShell scriptlerini değiştirmek için PowerShell'i kullanmak isterdim. Yine de, beynimi PowerShell'in aslında SQL sunucusuyla konuşabileceği farklı şekillerde dolaştırmakta zorlanıyorum. Bunların hepsi olup olmadığından emin değilim, ancak bir SQL sunucusunun sürümünü sorgulayabileceğim tamamen farklı 5 yöntem var:

1. SQLConnection .NET Sınıfı

$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. WMI Sağlayıcısı

$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. Çağırın-SQLCMD

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

Bu senaryolardan hangisinin farklı senaryolar için kullanılacağına nasıl karar vereceğim? Her birinin artıları / eksileri var mı? Bu powershell 1.0 tekniklerinden bazıları 2.0'da üst üste getirilmiş midir? Bazıları SQL 2000 veya 2005 sunucuları ile iletişim kurmak için çalışmayacak mı?

Bir düzeyde, cevabın "ne işe yararsa onu kullan" olduğundan eminim, ancak Powershell'de yeni olan biri için, yukarıda en çok ve en az (en çok aklımda) olduğu gibi, yukarıdaki # 1 gibi yazılmış birçok örneği görmek çok kafa karıştırıcı. "powershell benzeri" örneği.

İlgili olması durumunda biraz daha fazla bilgi: Monitör komut dosyalarını çalıştıracak olan SQL sunucusu SQL 2005, ancak SQL 2000'den 2008R2'ye kadar birden fazla örneğe bağlanmak için kullanılır.


1
İlk olarak, harika bir soru ve çok ayrıntılı. +1. Muhtemelen bu listeyi ikiye böldüm: ADO.NET (ilk olanınız) ve SMO. WMI biraz sakar olabilir ve daha az tuşa basılsa bile, ilk bakışta ne olacağı çok açık değildir.
Thomas Stringer

Yanıtlar:


7

Açıkçası, bunun birçoğu basit kişisel tercihlere dayanıyor. İşte benim, kişisel, rasyonelleşmelerim.

Powershell'i PSH v 1.0'dan beri SQL SQL ile kullanıyorum ve SQL Server resmi olarak entegre etmeden önce. (PSH ile başladığımda, SQL Server 2000 ve 2005 sunucularını yönetiyordum.) Böylece, SMO'yu öğrendim (veya şu anda adı kaçan biraz daha eski bir enkarnasyon) ve. onlar. Genellikle SMO'ya yaslanırdım, çünkü bazı şeyleri kodlamak gibi çok daha kolay hale getirir. Kendi kodum bazı zamanlarda SMO'yu ve bazı durumlarda Net'i kullanır. Örneğin, basit sonuç kümeleri elde etmek için .Net'i kullanmanın hantal olduğunu düşünüyorum.

Çok fazla sayıda TSQL kodunuz varsa, Invoke-SQLCMD'nin daha mantıklı olduğunu düşünüyorum. Dizeler yaratıyorsanız ve bunları -Query üzerinden çalıştırıyorsanız, bu karışıklık olur. Powershell’in .Net ve SMO ile nasıl çalıştığını iyi anladıysanız, zaman zaman Invoke-SQLCMD kullanmak, çalıştırmak için bir komut dosyasına sahip olduğunuzda kolaydır.

PSDrive olayını her zaman gereksiz buldum ve "her şey bir dosya sistemi gibi görünebilir" fikrine kapıldıkları için uyguladıklarını hissettim. * Nix adamlarının proc ve benzeri şeyleri sevdiğini biliyorum ama bu uygulamanın bir tür zorunluluk hissettiğini hissediyorum. Bence PSDrive iyi, belki de UI'den nefret ediyorsanız, bir şeyleri araştırmaktan iyidir, ama onu kullanan bir senaryo yazmadım.

WMI sağlayıcısını kullanan hiç kimseyi görmedim. Yani, bu benim son tercihim olurdu.

Yani, SMO ile önderlik eder ve ne zaman uygun olursa, Net'e geri dönerim.


1
Akılda tutulması gereken bir şey Invoke-SQLCmdbağlantıları çok incelikle yapmamasıdır. Ayrı sorgular bir sürü bir senaryo varsa, bağlantılar / kalıcı yeniden ya da sadece söylemek ile beklenmedik sorunlara yol açabilir düşmedi edilebilir #TEMPısrarlı tablolar veya kaynak sorunları.
JNK

3

Yeni iş için 4, mevcut komut dosyalarını veya yerleri yeniden kullanmak için 5, T-SQL nesne tabanlı / şık stil kodundan daha mantıklıdır. Bunları en çok seviyorum çünkü açık ve basitler.


2

Mümkünse SQLPS kullanmaya meyilliyim. Daha basittir ve komut dosyalarında kullanırsam SMO kullanmaya çalışmaktan daha kolay okunur ve daha az yazı yazar. SMO, iyi bir güce sahip olduğu bir yer edindi, ancak zaman zaman aşina olmadığınız durumlarda, kafa karıştırıcı olabilir.

SQL Server sürümleri yayınlandığında, SQLPS'in geliştirileceğini düşünüyorum. Özellikle de SQL Server 2012 ile SQLPS, ek bileşen olmak yerine modüler değildir. Bu, Microsoft'un servis paketleri veya düzeltmeler, hatta hatta CU'lar aracılığıyla SQLPS ile düzeltmeler veya geliştirmeler yapmasını sağlar.

Daha sonra , sizin için hazırladığınız SMO kodunun birçoğunu cmdlet'ler ve işlevler olarak hazırlamış olan SQLPSX gibi topluluk teklifleri de var . Hangi tekerleği yeniden icat etmiyorum hakkında :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.