В конечном итоге я хотел бы использовать 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.
Ответы:
Очевидно, многое из этого переходит к простому личному выбору. Вот мои собственные, личные, обоснования.
Я использую 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, когда это будет удобно.
источник
Invoke-SQLCmd
что он не очень элегантно обрабатывает соединения. Если у вас есть сценарий с большим количеством отдельных запросов, соединения могут сохраняться / повторно использоваться или просто не удаляться, что может вызвать неожиданные проблемы с#TEMP
сохранением таблиц или проблемы с ресурсами.4 для новой работы, 5 для повторного использования существующих сценариев или мест T-SQL имеет больше смысла, чем объектный код / шикарный стиль. Мне нравятся эти, потому что они понятны и просты.
источник
Я склонен использовать SQLPS, если смогу. Это проще, и если я использую его в сценариях, его гораздо легче читать и меньше печатать, чем пытаться использовать SMO. SMO имеет свое место в том, что у него есть немало возможностей, но иногда он может сбивать с толку, если вы не знакомы с ним.
Я думаю, что по мере выпуска версий SQL Server SQLPS будет улучшаться. Тем более, что в SQL Server 2012 SQLPS не является модульным, а не является оснасткой. Это позволит Microsoft распространять исправления или улучшения с помощью SQLPS с помощью пакетов обновления или исправлений, возможно, даже CU.
Кроме того, есть также предложения сообщества, такие как SQLPSX , в котором есть много кода SMO, уже подготовленного для вас в качестве командлетов и функций. Который я все о том, чтобы не изобретать велосипед :)
источник