여러곳에서 연결을 해서 사용중인 DB 의 분리는, 계속해서 외부나 기타 App 에서 연결을 시도하기 때문에 단일 사용자 모드로 변경해도 오류가 발생하면서 진행되지 않을수 있음.
ALTER DATABASE 대상DB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
=> 다중 접속 서비스의 DB의 경우, 단일로 변경되어도 이미 그 단일 1개 연결이 즉시 되어 있어서 DB 분리 에러가 발생함
메시지 3703, 수준 16, 상태 2, 줄 1
데이터베이스 '대상DB'은(는) 현재 사용 중이므로 분리할 수 없습니다.
1. 방화벽을 통해서 SQL Port 를 차단하여 서버 외부 연결 방지
2. MSSQL 서비스외, SQLAgent 등 SQL 관련 다른 서비스를 모두 중지
3. 작업모니터 또는 프로세스 Kill 쿼리를 사용하여 대상 DB 연결 프로세스 모두 종료
4. DB 분리 EXEC sp_detach_db '대상DB', 'true';
* 주의 : Management Studio 와 같은 도구 이용시, DB목록을 열거 후 대상 DB를 선택하면 1개 연결이 되버리므로, DB 분리 쿼리문 연결 외 다른 연결이 되지 않도록 주의 필요
- 멀티 접속으로 변경시 ALTER DATABASE 대상DB SET MULTI_USER WITH ROLLBACK IMMEDIATE
- 아래와 같은 프로세스 kill 쿼리문과 함께 DB 분리 프로시져 쿼리문을 바로 붙여서 같이 실행
USE [master]
GO
SET NOCOUNT ON
DECLARE @DBName VARCHAR(50);
DECLARE @spidstr VARCHAR(8000);
DECLARE @ConnKilled SMALLINT
SET @ConnKilled = 0
SET @spidstr = ''
SET @DBName = '대상DB'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1) FROM master..sysprocesses
WHERE dbid=db_id(@DBName)
END