Какой метод 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. Invoke-SQLCMD

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

Как мне решить, какой из этих методов использовать для различных сценариев? Есть ли плюсы / минусы каждого? Являются ли некоторые из этих методов PowerShell 1.0, которые были превзойдены в 2.0? Некоторые из них не будут работать для связи с серверами SQL 2000 или 2005?

На одном уровне, я уверен, что ответ «использовать все, что работает», но для кого-то новичка в Powershell, очень сбивает с толку видеть так много примеров, написанных как # 1 выше, когда это самый длинный и (на мой взгляд) наименьший "PowerShell-подобный" пример.

Немного больше информации в случае, если это уместно: 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.