Hoo*_*ody 3 sql-server t-sql sql-server-2014
我有一个 C# 计划任务,它每晚运行,并包含一个 kill 命令来删除现有数据库,以便可以重新创建它。它大约每周随机生成一次此错误。
杀死数据库失败。用户无权更改数据库“Foo”、数据库不存在或数据库未处于允许访问检查的状态。杀死数据库失败。
使用的C#如下。
srv.KillAllProcesses;
srv.KillDatabase;
Run Code Online (Sandbox Code Playgroud)
所以我已经在尝试终止所有进程。在执行 kill 命令之前是否还有其他检查或命令可以确保它成功执行?这不可能是用户权限问题,因为该操作大部分时间都在工作,那么什么可能导致“未处于允许访问检查的状态”?
当您执行srv.KillAllProcesses;
SMO 时,将为KILL <spid>
连接到数据库的每个进程启动一个。
一旦执行了这些 kill 命令,某些事务可能仍在回滚。我不确定在事务仍在回滚时将您的数据库置于返回错误消息的状态,但在任何情况下都不需要该调用的幕后情况。
仅调用srv.KillDatabase;
将ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
在尝试使用 删除数据库之前执行 a DROP DATABASE
,从而有效地终止/回滚任何活动事务。
这ALTER DATABASE
是返回您收到的错误的语句。
这可以通过查看分析器跟踪或扩展事件目标来验证。
如果在您将数据库设置为单用户模式时其他用户连接到数据库,则他们与数据库的连接将在没有警告的情况下关闭。
没有理由先杀死已处理的,您可能应该删除该行代码