ฉันควรใช้เทคนิค PowerShell ใดเพื่อพูดคุยกับ SQL Server


29

ในที่สุดฉันต้องการใช้ PowerShell เพื่อแทนที่สคริปต์ KornShell เก่าที่เราใช้สำหรับการมอนิเตอร์อินสแตนซ์ SQL แม้ว่าฉันจะมีช่วงเวลาที่ยากลำบาก แต่ก็ทำให้สมองของฉันได้รับวิธีที่ต่างกันที่ PowerShell สามารถพูดคุยกับเซิร์ฟเวอร์ SQL ได้ ไม่แน่ใจว่าเป็นของพวกเขาทั้งหมดหรือไม่ แต่นี่เป็นวิธีที่ต่างกันทั้งหมด 5 วิธีที่ฉันสามารถสืบค้นรุ่นของเซิร์ฟเวอร์ 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. ผู้ให้บริการ 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. เรียกใช้-SQLCMD

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

ฉันจะตัดสินใจเกี่ยวกับเทคนิคเหล่านี้เพื่อใช้ในสถานการณ์ที่แตกต่างกันอย่างไร มีข้อดีข้อเสียของแต่ละข้อ? บางส่วนของเทคนิค powershell 1.0 เหล่านี้ถูกใช้เกิน 2.0 หรือไม่? บางคนจะไม่สามารถสื่อสารกับเซิร์ฟเวอร์ SQL 2000 หรือ 2005 ได้หรือไม่

ในระดับหนึ่งฉันแน่ใจว่าคำตอบคือ "ใช้งานอะไรก็ได้" แต่สำหรับบางคนที่เพิ่งรู้จัก Powershell มันสับสนมากที่เห็นตัวอย่างมากมายที่เขียนขึ้นเช่น # 1 ด้านบนเมื่อนั่นเป็นเวลาที่ยาวที่สุดและน้อยที่สุด (ในใจ) ตัวอย่าง "powershell-like"

ข้อมูลเพิ่มเติมเล็กน้อยในกรณีที่มีความเกี่ยวข้อง: เซิร์ฟเวอร์ SQL ที่จะใช้งานสคริปต์ตรวจสอบจริง ๆ คือ SQL 2005 แต่ใช้เพื่อเชื่อมต่อกับอินสแตนซ์หลายตัวจาก SQL 2000 จนถึง 2008R2


1
ก่อนอื่นคำถามที่ดีและละเอียดมาก +1 ฉันอาจ จำกัด รายการนี้ให้เหลือสองรายการ: ADO.NET (รายการแรกของคุณ) และ SMO WMI นั้นค่อนข้างงุ่มง่ามและแม้ว่ามันจะกดแป้นน้อยกว่า แต่ก็ไม่ใช่ "ชัดเจน" ในตอนแรกสิ่งที่จะเกิดขึ้น
Thomas Stringer

คำตอบ:


7

เห็นได้ชัดว่ามีผู้คนจำนวนมากที่หลงทางไปสู่ทางเลือกส่วนตัวที่เรียบง่าย นี่คือเหตุผลส่วนตัวของฉันเอง

ฉันใช้ Powershell กับ SQL SQL ตั้งแต่ PSH v 1.0 และก่อนที่ SQL Server จะเริ่มรวมเข้าด้วยกันอย่างเป็นทางการ (เมื่อฉันเริ่มต้นด้วย PSH ฉันจัดการเซิร์ฟเวอร์ SQL Server 2000 และ 2005) ดังนั้นฉันเรียนรู้กับ SMO (หรือเป็นชาติที่เก่ากว่าเล็กน้อย พวกเขา ฉันมักจะเอนตัวไปทาง SMO เนื่องจากทำให้บางสิ่งง่ายขึ้นมากเช่นการเขียนสคริปต์วัตถุ รหัสของฉันใช้ SMO บางครั้งและ. Net บางครั้ง ฉันคิดว่ามันง่ายกว่าที่จะใช้. Net เพื่อรับชุดผลลัพธ์อย่างง่าย

ฉันคิดว่า Invoke-SQLCMD เหมาะสมกว่าถ้าคุณมีสคริปต์ TSQL อยู่มากมาย หากคุณกำลังสร้างสตริงและดำเนินการผ่าน -Query นั่นจะเป็นเรื่องยุ่ง หากคุณมีความเข้าใจอย่างถ่องแท้ว่า Powershell ทำงานอย่างไรกับ. Net และ SMO การใช้ Invoke-SQLCMD เป็นครั้งคราวเมื่อคุณมีไฟล์สคริปต์ที่จะเรียกใช้นั้นเป็นเรื่องง่าย

ฉันมักจะพบสิ่งที่ PSDrive clunky และรู้สึกว่าพวกเขาใช้มันเพราะพวกเขาจมอยู่กับความคิด "ทุกอย่างสามารถดูเหมือนระบบไฟล์" ฉันรู้ว่าคนที่ชอบ * รัก \ proc และเช่นนั้น แต่ฉันรู้สึกว่าการยั่วยุนี้รู้สึกเหมือนถูกบังคับ ฉันคิดว่า PSDrive นั้นโอเคอาจจะดีถ้าคุณเกลียด UI สำหรับการสำรวจสิ่งต่าง ๆ แต่ฉันไม่เคยเขียนสคริปต์ที่ใช้มัน

ฉันไม่เคยเห็นใครใช้ตัวให้บริการ WMI ดังนั้นนั่นจะเป็นตัวเลือกสุดท้ายของฉัน

ดังนั้นฉันจะเป็นผู้นำกับ SMO และถอยกลับไปที่. Net เมื่อมันสะดวกกว่า


1
สิ่งที่ต้องคำนึงถึงInvoke-SQLCmdก็คือมันไม่ได้จัดการการเชื่อมต่ออย่างสง่างาม หากคุณมีสคริปต์ที่มีข้อความค้นหาแยกต่างหากจำนวนมากการเชื่อมต่ออาจยังคงอยู่ / นำกลับมาใช้ใหม่หรือเพียงแค่ไม่ทำตกซึ่งอาจทำให้เกิดปัญหาที่ไม่คาดคิดกับ#TEMPตารางพูดที่คงอยู่หรือปัญหาทรัพยากร
JNK

3

4 สำหรับงานใหม่ 5 สำหรับการนำสคริปต์หรือสถานที่ที่มีอยู่กลับมาใช้ใหม่ T-SQL เหมาะสมกว่าโค้ดสไตล์เชิงวัตถุ / posh ฉันชอบสิ่งที่ดีที่สุดเพราะชัดเจนและเรียบง่าย


2

ฉันมักจะโน้มตัวไปใช้ SQLPS ถ้าทำได้ มันง่ายกว่าและถ้าฉันใช้มันในสคริปต์ง่ายต่อการอ่านและพิมพ์น้อยกว่าการพยายามใช้ SMO SMO มีจุดยืนในเรื่องที่ว่ามันมีพลังงานที่ดี แต่อาจทำให้สับสนในบางครั้งที่จะใช้หากคุณไม่คุ้นเคยกับมัน

ฉันคิดว่าเวอร์ชัน SQL Server นั้นเปิดตัวแล้ว SQLPS จะได้รับการปรับปรุงให้ดีขึ้น โดยเฉพาะอย่างยิ่งตั้งแต่กับ SQL Server 2012 SQLPS ไม่ใช่โมดูลาร์แทนที่จะเป็นสแน็ปอิน สิ่งนี้จะทำให้ Microsoft สามารถผลักดันการแก้ไขหรือปรับปรุงด้วย SQLPS ผ่าน Service Pack หรือโปรแกรมแก้ไขด่วนหรือแม้แต่ CUs

จากนั้นยังมีข้อเสนอชุมชนเช่นSQLPSXซึ่งมีรหัส SMO จำนวนมากที่ได้จัดเตรียมไว้สำหรับคุณในฐานะ cmdlets และฟังก์ชั่น ซึ่งฉันทุกคนเกี่ยวกับการไม่ประดิษฐ์ล้อใหม่ :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.