使用powershell将数据库设置为脱机

时间:2017-05-29 02:00:09

标签: sql-server powershell smo

我正在使用PowerShell中的自动数据库还原脚本并尝试强化它。从较高的层面来看,它是这样的:

$s = new-object microsoft.sqlserver.management.smo.server '.';
$db = $s.Databases['myDb'];

$db.SetOffline();
# start restore here

此处的问题是,如果数据库中存在任何连接,则SetOffline()命令将被阻止。我知道Server对象上有KillDatabase()KillAllProcesses()方法,但是前者让我不得不再次将日志文件清零,而后者在繁忙的服务器上有竞争条件。我正在寻找的是SMO等同于alter database [myDb] set offline with rollback immediate;

这样的事情存在吗?我可以采取一些ExecuteNonQuery()恶作剧,但似乎应该有更优雅的方式。

1 个答案:

答案 0 :(得分:0)

那么如果您先在防火墙中阻止对SQL的访问,然后再阻止KillAllProcesses,该怎么办?
这样一来,一切都将无法重新连接,也就不会出现竞争状况...

New-NetFirewallRule -DisplayName BlockSQL -Service MSSQL -Direction Inbound -Action Block -Enabled True

由于MSSQL被阻止通过网络进行任何通信,因此您当然需要在本地调用SetOffline方法。

将DB:s脱机后,只需删除防火墙规则...

Remove-NetFirewallRule -DisplayName BlockSQL