Яку техніку PowerShell я повинен використовувати для розмови з SQL Server?


29

Зрештою, я хотів би використовувати PowerShell для заміни старих скриптів KornShell, які ми використовуємо для моніторів екземплярів SQL. Мені важко, хоча мозок обміняє всі різні способи, якими PowerShell може насправді спілкуватися з SQL-сервером. Не впевнений, чи це все вони, але ось 5 абсолютно різних способів я можу запитати версію SQL-сервера:

1. Клас 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. Постачальник WMI

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

3. СМО

[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 вище, коли це найдовше і (на мій погляд) найменше приклад "уподобання".

Трохи більше інформації, якщо це доречно: сервер SQL, який фактично виконує сценарії монітора, - це SQL 2005, але він використовується для підключення до декількох екземплярів від SQL 2000 до 2008R2.


1
По-перше, велике запитання і дуже ретельно. +1. Я, мабуть, звузив би цей список до двох: ADO.NET (ваш перший) та SMO. WMI може бути трохи незграбним, і навіть якщо це менше натискань клавіш, на перший погляд не так "очевидно", що буде.
Томас Стрінгер

Відповіді:


7

Очевидно, що багато чого пов'язане з простим особистим вибором. Ось мої власні, особисті, раціоналізації.

Я використовую Powershell з SQL SQL ще з PSH v 1.0 і до того, як SQL Server почав офіційно його інтегрувати. (Коли я починав з PSH, я керував серверами SQL Server 2000 та 2005 року.) Отже, я дізнався з SMO (або це трохи старше втілення, назва якого в даний час уникає мене) та .Net, і я звик їх. Я, як правило, схиляюся до SMO, оскільки це робить деякі речі набагато простішими, як, наприклад, сценарій об'єктів. У моєму власному коді інколи використовується SMO, а інший раз .Net. Я думаю, що зручніше використовувати. Net, наприклад, для отримання простих наборів результатів.

Я думаю, що Invoke-SQLCMD має більше сенсу, якщо у вас є багато існуючих скриптів TSQL. Якщо ви створюєте рядки і виконуєте їх через -Query, це буде безладним. Якщо ви добре розумієте, як Powershell працює з .Net та SMO, використовуючи Invoke-SQLCMD періодично, коли у вас є запуск файлу сценарію, це легко.

Я завжди знаходив річ PSDrive незграбно і вважав, що вони її реалізували, оскільки потрапили в ідею "все може виглядати як файлова система". Я знаю, що * nix хлопці люблять \ proc та таке, але я відчуваю, що це втручання відчуває себе вимушеним. Я думаю, що PSDrive в порядку, можливо, навіть добре, якщо ви ненавидите інтерфейс користувача, для вивчення речей, але я ніколи не писав сценарій, який його використовує.

Я ніколи не бачив, щоб хтось використовував постачальник WMI. Отже, це був би мій останній вибір.

Тож я б вела з SMO і повертаюся до .Net, коли це зручніше.


1
Що слід пам’ятати Invoke-SQLCmd, це не дуже витончено поводиться з зв’язками. Якщо у вас є сценарій з великою кількістю окремих запитів, з'єднання можуть зберігатися / повторно використовуватися або просто не припинятись, що може спричинити несподівані проблеми із #TEMPзбереженими таблицями скажімо або проблемами з ресурсами.
JNK

3

4 для нової роботи, 5 для повторного використання існуючих сценаріїв або місць T-SQL має більше сенсу, ніж код об'єктного / шикарного стилю. Мені подобаються найкращі, тому що вони чіткі та прості.


2

Я схильний схилятися до використання SQLPS, якщо можу. Це простіше, і якщо я використовую його в сценаріях, це набагато простіше читати і менше набирати текст, ніж намагатися використовувати SMO. SMO має своє місце в тому, що він має непоганий потенціал, але може часом заплутати, якщо ви не знайомі з ним.

Я думаю, що після виходу версій SQL Server SQLPS буде покращено. Тим більше, що для SQL Server 2012 SQLPS не є модульним замість того, щоб бути оснащеним. Це дозволить Microsoft висунути виправлення чи вдосконалення SQLPS через пакети послуг чи виправлення, можливо навіть CU.

Тоді також є спільноти на зразок SQLPSX , у яких є багато того SMO-коду, який вже підготовлений для вас як командлети та функції. Що я все про те, щоб не винаходити колесо :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.