我正在使用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()
恶作剧,但似乎应该有一种更优雅的方法。
最佳答案
那么,如果您先在防火墙中阻止对SQL的访问,然后再阻止KillAllProcesses,该怎么办?
这样一来,任何东西都将无法重新连接,也就不会出现竞争状况。
New-NetFirewallRule -DisplayName BlockSQL -Service MSSQL -Direction Inbound -Action Block -Enabled True
当然,您将需要在本地调用SetOffline方法,因为MSSQL被阻止通过网络进行任何通信。将数据库脱机后,只需删除防火墙规则...
Remove-NetFirewallRule -DisplayName BlockSQL
关于sql-server - 使用Powershell脱机设置数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44233726/