The*_*Woo 9 database-design sql-server powershell
我有足够的 PowerShell 技能来开始工作,但没有使用 SQL 服务器。有人可以指出我如何使用 PowerShell 获取有关远程 SQL 服务器的信息以识别其上运行的数据库的正确方向。
谢谢你的帮助。
编辑 - 使用 SMO 代码
我试图将这段代码放在一起,但得到错误:找不到类型 [Microsoft.SqlServer.Management.Smo.Server] 确保加载了包含此类型的程序集
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$sqlServer = New-Object("Microsoft.SqlServer.Management.Smo.Server") "MSQLULTDBS04"
foreach($sqlDatabase in $sqlServer.databases) {$sqlDatabase.name}
Run Code Online (Sandbox Code Playgroud)
小智 12
您有两个选项,这两个选项都需要在您运行命令的主机上安装 SQL Server Management Studio:
我倾向于后者,因为它包含一种更容易学习的基本任务格式,例如获取实例中的对象列表。
使用 SMO,您必须加载要使用的适当程序集。在大多数情况下Microsoft.sqlserver.management.smo.server将是最常用的一种。
使用 SQLPS,您必须知道您使用的是哪个版本的 SQL Server。SQL Server 2008 R2(和 R1)您将使用add-pssnapin *sql*SQL Server 2012 及更高版本import-module SQLPS。
现在来解决获取数据库列表的问题。
SQLPS 方法
dir SQLSERVER:\\SQL\ServerName\Default\Databases | select name
Run Code Online (Sandbox Code Playgroud)
以上将针对默认命名实例,如果它是命名实例,则将“默认”更改为您的实例名称。
SMO法
$srv = New-Object 'Microsoft.SqlServer.Management.SMO.Server' "myInstance"
$srv.Databases | select name
Run Code Online (Sandbox Code Playgroud)
现在,上面的代码可以很容易地包装成一个函数或每个循环,这将允许您轻松地传入多个服务器名称。
编辑
根据您在 PowerShell 上阅读的文献,您会发现大多数花时间编写脚本的人会继续花时间使其成为可重复的脚本。这是通过一个函数(对我来说是基本级别)然后模块(更高级的我还没有接触过)来完成的。
所以对于您的示例代码:
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$sqlServer = New-Object("Microsoft.SqlServer.Management.Smo.Server") "MSQLULTDBS04"
foreach($sqlDatabase in $sqlServer.databases) {$sqlDatabase.name}
Run Code Online (Sandbox Code Playgroud)
foreach不需要您的循环来输出数据库列表。这是 SMO 中的一个对象,它包含多个属性,其中之一是namePowerShell 将简单地以默认格式输出,如下所示:
这里需要注意的 SMO 和 SQLPS 之间的区别是 SQLPS 默认不会输出系统数据库,SMO 会。
如果您在 PowerShell Profiles 上查找博客文章,通常要做的就是向其中添加程序集命令,以便每次打开 PowerShell 命令时它都已经可用。然后我将添加基本上是我经常使用的命令的函数,并且恰好有一个用于数据库的函数:
function Get-DBList ($server)
{
$srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $server
$srv.Databases | Select name, RecoveryModel,
@{Label="CompatibilityLevel";Expression={($_.CompatibilityLevel).ToString().Replace("Version", "")}}
} #end Get-DBList
Run Code Online (Sandbox Code Playgroud)
您可以根据自己的喜好修改它,但是如果我使用本地实例调用它,我会得到下面的输出。

我会继续告诉你一些我很难找到的东西。使用 SMO,您可以连接到 SQL Server 2000 直到 SQL Server 2014,但是,每个版本的 SQL Server 可能因特定属性所在的位置而异。一天下午,我在 Twitter 上与 Jonathan Kehayias 进行了一次学习对话,了解了这一点,但我不记得我在寻找什么财产。在这些情况下,MSDN 上用于 SMO的.NET 类库是您的朋友,因为它可以帮助您找到正在寻找的属性。