9

我需要从我的应用程序执行数据库恢复。在这样做之前,我想杀死所有进程,如下所示:

    private void KillAllProcessesOnSMARTDatabases(Server targetServer)
    {
        targetServer.KillAllProcesses(SMART_DB);
        targetServer.KillAllProcesses(SMART_HISTORY_DB);
        targetServer.KillAllProcesses(SMART_METADATA_DB);
        SqlConnection.ClearAllPools();
    }

但是,当第一个 KillAllProcesses 运行时,我得到以下异常:

Microsoft.SqlServer.Management.Smo.FailedOperationException:删除服务器“MYServer”的所有活动数据库连接失败。---> Microsoft.SqlServer.Management.Common.ExecutionFailureException:执行 Transact-SQL 语句或批处理时发生异常。---> System.Data.SqlClient.SqlException:只能杀死用户进程。

用于创建服务器的连接字符串具有 sa 凭据,但是,需要终止的进程是在不同的用户下启动的。我测试了类似的场景,测试成功了。

这种情况最近才开始发生。对我来说,似乎有一些进程不是由用户启动的?

4

2 回答 2

10

您的代码似乎正在尝试终止所有 SQL Server 进程,这不是一个好主意。

如果要执行数据库还原,应将相关数据库设置为 single_user 模式或 RESTRICTED_USER 模式,后者最合适。

请看以下将数据库切换到 RESTRICTED_USER 模式的示例以及如何关闭该过程中任何打开的用户连接。

如何:将数据库设置为单用户模式

于 2009-09-17T14:24:09.040 回答
-1

您可以使用 SMO 来“杀死”特定的数据库。这将强制只删除与该数据库的所有客户端连接,然后删除数据库本身

Microsoft.SqlServer.Management.Smo.Server oServer = this.GetSmoServer();
oServer.KillDatabase(this.DatabaseName);
于 2010-07-22T01:31:15.870 回答