Bra*_*adC 30 monitoring sql-server powershell
我最终想使用 PowerShell 来替换我们用于 SQL 实例监视器的旧 KornShell 脚本。但是,我很难让我的大脑围绕 PowerShell 实际与 SQL Server 通信的所有不同方式。不确定这是否是全部,但我可以通过以下 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]
Run Code Online (Sandbox Code Playgroud)
2. WMI 提供程序
$sqlProperties = Get-WmiObject
-computerName "MyServer"
-namespace root\Microsoft\SqlServer\ComputerManagement10
-class SqlServiceAdvancedProperty
-filter "ServiceName = 'MSSQLSERVER'"
$sqlProperties.VERSION
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
4. PSDrive
Set-Location SQLSERVER:\SQL\MyServerName\
$server = Get-Item Default
$server.get_VersionString()
Run Code Online (Sandbox Code Playgroud)
5.调用-SQLCMD
Invoke-Sqlcmd -Query "SELECT @@version" -ServerInstance "MyServer"
Run Code Online (Sandbox Code Playgroud)
我应该如何决定将哪些技术用于不同的场景?各有优缺点吗?这些 PowerShell 1.0 中的某些技术是否在 2.0 中被取代?其中一些不能与 SQL 2000 或 2005 服务器通信吗?
在一个层面上,我确信答案是“使用任何有效的方法”,但是对于 Powershell 的新手来说,看到这么多像上面 #1 一样编写的示例非常令人困惑,而这是最长的并且(在我看来)最少“类似powershell”的例子。
如果相关,请提供更多信息:实际运行监视器脚本的 SQL 服务器是 SQL 2005,但它用于连接到从 SQL 2000 到 2008R2 的多个实例。
显然,这很大程度上取决于简单的个人选择。以下是我个人的合理化解释。
从 PSH v 1.0 开始,在 SQL Server 开始正式集成它之前,我一直在使用 Powershell 和 SQL SQL。(当我开始使用 PSH 时,我正在管理 SQL Server 2000 和 2005 服务器。)所以,我学习了 SMO(或者它是稍微老一点的化身,它的名字目前让我无法理解)和 .Net,我已经习惯了他们。我通常倾向于 SMO,因为它使某些事情变得更容易,例如编写对象脚本。我自己的代码有时使用 SMO,有时使用 .Net。例如,我认为使用 .Net 来获取简单的结果集更方便。
我认为如果您有大量现有的 TSQL 脚本,则 Invoke-SQLCMD 更有意义。如果您正在创建字符串并通过 -Query 执行它们,那将会很混乱。如果您很好地掌握了 Powershell 如何与 .Net 和 SMO 一起工作,那么偶尔使用 Invoke-SQLCMD,当您有一个脚本文件要运行时,很容易。
我一直觉得 PSDrive 的东西很笨拙,并觉得他们实施了它,因为他们陷入了“一切都可以看起来像文件系统”的想法中。我知道 *nix 人喜欢 \proc 之类的东西,但我觉得这种实现感觉有点强迫。我认为 PSDrive 还可以,如果你讨厌 UI,甚至可能很好,用于探索事物,但我从未编写过使用它的脚本。
我从未见过有人使用 WMI 提供程序。所以,这将是我最后的选择。
所以,我会使用 SMO 并在更方便的时候回退到 .Net。