단일 사용자 모드에서 데이터베이스를 삭제하는 방법 데이터베이스 ‘DatabaseName’에 대한 변경에 실패했습니다. (Microsoft.SqlServer.Smo)

DatabaseName (Single User)이름으로 표시되는 데이터베이스를 삭제하려면 어떻게합니까 ?

삭제하려고하면 다음 오류가 발생합니다.

데이터베이스 ‘DatabaseName’에 대한 변경에 실패했습니다. (Microsoft.SqlServer.Smo)

ALTER DATABASE 문이 실패했습니다. (Microsoft SQL Server, 오류 : 5064)

나는 ALTER아래 를 실행하려고했지만 여전히 같은 문제가 있습니다.

ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT


답변

데이터베이스를 삭제하려는 경우 해당 데이터베이스에 대한 유일한 연결이어야합니다. 다른 연결이 있으면 삭제할 수 없습니다. 오류 메시지에서 (이 오류는 데이터베이스가 Single_User 모드에 있지만 이미 연결되어 있으므로 연결할 수 없음을 의미합니다) 내 가정은 Single_User 모드로 설정하려고 시도한 후 삭제를 시도했지만 당신이 알지 못하거나 다른 프로세스가 가지고있는 연결을 잡았습니다. SSMS를 다시 시작하면 효과가 있다는 사실을 알 수 있습니다. 이를 해결하는 방법은 다음과 같습니다.

논리적으로 데이터베이스를 다시 다중 사용자 모드로 설정해야 단일 데이터베이스를 다시 단일 사용자 모드로 전환 할 수 있습니다 (그러나 이번에는 허용 된 단일 연결을 제어하고 다른 것이 연결되기 전에 데이터베이스를 삭제함). 없어

다음 코드는이 작업을 수행하는 방법입니다 ( 그러나 먼저 해당 데이터베이스에 연결된 쿼리 창을 닫습니다. SSMS를 다시 시작하고 개체 브라우저에서이 데이터베이스를 선택하지 않았는지 확인하십시오 ).

-- Then attempt to take your database to multi_user mode, do this from master
USE MASTER 
GO

ALTER DATABASE myDatabaseName 
SET multi_user WITH ROLLBACK IMMEDIATE
GO

-- Now put it into single_user mode and drop it. Use Rollback Immediate to disconnect any sessions and rollback their transactions. Safe since you are about to drop the DB.
ALTER DATABASE myDatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE myDatabaseName
GO

답변

이미 단일 사용자 모드 인 데이터베이스에 액세스하려고하면 먼저 데이터베이스에 대한 모든 연결을 닫아야합니다. 그렇지 않으면 오류 메시지가 나타납니다.

메시지 5064, 수준 16, 상태 1, 줄 1 현재 데이터베이스 이름 ‘DatabaseName’의 상태 또는 옵션을 변경할 수 없습니다. 데이터베이스가 단일 사용자 모드에 있으며 사용자가 현재 연결되어 있습니다. 메시지 5069, 수준 16, 상태 1, 줄 1 ALTER DATABASE 문이 실패했습니다.

다음 쿼리는 데이터베이스에 액세스하는 프로세스를 죽이고 :

-- Create the sql to kill the active database connections  
declare @execSql varchar(1000), @databaseName varchar(100)  
-- Set the database name for which to kill the connections  
set @databaseName = 'DatabaseName'  

set @execSql = ''   
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '  
from    master.dbo.sysprocesses  
where   db_name(dbid) = @databaseName  
     and  
     DBID <> 0  
     and  
     spid <> @@spid  
exec(@execSql)
GO

그런 다음 평소와 같이 데이터베이스를 다중 사용자 모드로 되돌릴 수 있어야합니다.

ALTER DATABASE 'DatabaseName' SET MULTI_USER