sql-server - 使用Powershell脱机设置数据库

标签 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()恶作剧,但似乎应该有一种更优雅的方法。

最佳答案

那么,如果您先在防火墙中阻止对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/

相关文章:

sql-server - 在 SQL 和 C# 中根据出生日期计算年龄?

c# - 为什么 ASP.Net Identity 2 存储在 NVARCHAR 中的 UserId 中?

powershell - 是否可以将 $ErrorActionPreference = 'Stop' 配置为 powershell 模块中所有功能的默认值?

powershell - 基于Windows Server 1709在容器内使用args运行可执行文件

sql-server - throw 语句前加分号

sql-server - 使用生成的 DDL 时为 "<xyz> must be the first statement in a query batch"

Powershell 输出和 GUI 之间的 Windows 防火墙状态不同

sql-server - 使用 SQL Server 管理对象 (SMO) 获取列的长度

c# - SSMS SMO 对象 : Get query results

c# - 为什么 SMO 脚本程序不生成外键 header ?