ALTER DATABASE失败,因为无法将锁定放在数据库“<db_name>”上。稍后再试</db_name>

时间:2014-09-19 14:31:48

标签: sql-server tsql sql-server-2005

我真的不在乎我对这个测试数据库的处理方式......它适用于沙箱测试(附加到生产服务器实例)!我试图做的就是杀死所有连接,删除并创建test_db,如果没有要求太多......并使用一些测试数据进行恢复。

我已尝试USE [MASTER] RESTORE DATABASE test_DB WITH RECOVERY GO,但收到此错误:

  

Msg 3101,Level 16,State 1,Line 1   由于数据库正在使用,因此无法获得独占访问权限。   Msg 3013,Level 16,State 1,Line 1   RESTORE DATABASE异常终止。

另外,尝试过  USE [master] ALTER DATABASE test_DB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;,并收到错误:

  

Msg 5061,Level 16,State 1,Line 1   ALTER DATABASE失败,因为无法将锁定放在数据库&#39; test_DB&#39;上。稍后再试。   
消息5069,16级,1号,1号线   ALTER DATABASE语句失败。

也做了 select min(spid) from master..sysprocesses where dbid = db_id('test_DB'),但我的结果集已返回NULL

以下是我的代码:

 --- Kill Connections
    USE [master] 

    DECLARE @cmdKill VARCHAR(50)

    DECLARE killCursor CURSOR FOR
    SELECT 'KILL ' + Convert(VARCHAR(5), p.spid)
    FROM master.dbo.sysprocesses AS p
    WHERE p.dbid = db_id('test_DB')

    OPEN killCursor
    FETCH killCursor INTO @cmdKill

    WHILE 0 = @@fetch_status
    BEGIN
    EXECUTE (@cmdKill) 
    FETCH killCursor INTO @cmdKill
    END

    CLOSE killCursor
    DEALLOCATE killCursor 

    --Drop and Create 

    USE [master]
    GO

    IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'test_DB')
    DROP DATABASE [test_DB]
    GO

    USE [master]
    GO


        CREATE DATABASE [test_DB] ON  PRIMARY 
        ( NAME = N'test_db_Data', FILENAME = N'\\some_place\d$\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test_DB.mdf' , SIZE = 125635136KB , MAXSIZE = UNLIMITED, FILEGROWTH = 20%)
         LOG ON 
        ( NAME = N'test_db_Log', FILENAME = N'E:\SQLLogs\test_DB.ldf' , SIZE = 1064320KB , MAXSIZE = UNLIMITED, FILEGROWTH = 20%)
        GO

    ALTER DATABASE [test_db] SET ....

2 个答案:

答案 0 :(得分:0)

如果仍有打开的数据库,则无法使数据库脱机。

另外,请确保您的连接未使用该数据库(USE master),然后使用WITH ROLLBACK IMMEDIATE的{​​{1}}选项将其停用。

答案 1 :(得分:-1)

你知道谁有联系吗?

SELECT 
    DB_NAME(dbid) as 'DBName'
    , loginame as 'Login'
    , COUNT(dbid) as 'Connections'

FROM
    sys.sysprocesses
WHERE 
    dbid > 0
GROUP BY 
    dbid
    , loginame