【问题标题】:Disconnect active SQL connections from SMO从 SMO 断开活动 SQL 连接
【发布时间】:2012-02-15 20:28:20
【问题描述】:

有没有办法使用 SMO 断开所有活动用户与 SQL 数据库的连接,以便我可以执行数据库恢复?

下面链接的问题类似,但没有讨论 SMO 的使用。

When restoring a backup, how do I disconnect all active connections?

此链接也是一个类似的问题,但仍未得到解答:

http://us.generation-nt.com/answer/smo-detach-fails-due-active-connection-help-122972951.html

【问题讨论】:

  • 您始终可以将database.useraccess 属性设置为单用户模式...
  • 哦,太好了!我试试看……
  • 你的解决方案是什么?

标签: sql-server powershell smo


【解决方案1】:

您可以使用 KillAllProcesses 方法。

add-type -AssemblyName "Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
$serverObject = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -argumentList 'YourServerNameHere'
$serverObject.KillAllProcesses('YourDatabaseNameHere')
如果要检查,可以使用 GetActiveDBConnectionCount 方法。但是您可能需要等待几秒钟以进行回滚等
$serverObject.GetActiveDBConnectionCount('YourDatabaseNameHere')

【讨论】:

  • 啊哈!这就是我一直在寻找的。我从 OP 的评论中尝试了 Database.UserAccess 属性,这似乎没有任何影响。也许我不得不等到所有用户都断开连接。在我有机会测试并接受它之前,对这个答案进行投票。
【解决方案2】:

断开所有活动用户不是构建功能。您必须使用 ExecuteNonQuery。我在这里找到了一个例子:http://www.techtalkz.com/microsoft-windows-powershell/132252-run-transact-sql-using-smo.html

【讨论】:

  • 我认为Database 类应该有一个DisconnectAll() 方法或类似的方法。有没有办法做到这一点?
  • 问题是如果您的服务器很忙并且您设置了单用户模式,那么其他进程很容易控制并且您无法恢复数据库。在单个脚本中执行此操作可以防止这种头痛。以ALTER DATABASE databasename SET SINGLE_USER WITH ROLLBACK IMMEDIATE 开头。在同一个脚本中进行恢复并使用ALTER DATABASE databasename SET MULTI_USER WITH ROLLBACK IMMEDIATE 完成
猜你喜欢
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
相关资源
最近更新 更多