背景
- 在我目前的组织中,我们有一个运行 Powershell 脚本的 SQL 代理作业,最初基于Script All Server Level Objects to Recreate SQL Server。
- 这项工作编写了一堆脚本,可以在我们需要进行灾难恢复的情况下使用。
- 我们的版本查询一个单独的数据库,该数据库列出了应该检查的服务器。
- 在这份工作之前,我没有使用过 Powershell,尽管我有过其他脚本编写经验(例如 Python)。
- 我们还设置了所有服务器,使用 SQL Server 代理在登录失败时向 DBA 发送电子邮件。
- 我们的一个开发服务器上有几个数据库,这些数据库出于某些(对我而言)未知的业务目的而脱机。
- 当我们的 SQL 代理作业运行时,当涉及到该开发服务器上的那些脱机数据库时,它总是会生成登录失败警报。我被要求查看是否有某种方法可以让脚本跳过检查离线数据库以防止这些错误警报。
- 我已经将警报的来源追溯到下面的函数。我相信这一点
if($database.Status -eq 'Normal')
是为了确保数据库在线但它不起作用。 - 基于其他一些在线阅读,我尝试用 替换
if($database.Status -eq 'Normal')
,if ($database.IsAccessible)
但在运行脚本时我仍然收到登录失败的警报电子邮件。
#Function to write out Database scripts
function ScriptOutDBObjects($serverObject, $objectType)
{
foreach ($database in $srv.Databases)
{
if($database.Status -eq 'Normal')
{
$objectPath = $scriptPath + $objectType +'\'
if (!(Test-Path -Path $objectPath))
{
New-Item -ItemType Directory -Path $objectPath
}
$scriptingOptions.FileName = $objectPath + $database.Name.Replace(':','').Replace('\', '_') +'.sql'
$database.Script($scriptingOptions)
}
}
}
- 这项工作使用的是 Powershell 类型,但在本地计算机上运行 Powershell ISE 的代码时,我得到了相同的结果。
问题
Microsoft.SqlServer.Management.Smo会一直尝试打开数据库吗?如果是这样,是否有一些标志或什么我可以通过它使其不这样做?