답변:
Adam이 제안한 접근 방식이 작동하지 않는 이유 는 활성 연결을 반복하는 동안 새로운 연결을 설정할 수 있기 때문입니다. 대신이 단점이없는 다음 방법을 사용할 수 있습니다.
-- set your current connection to use master otherwise you might get an error
use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE
--do you stuff here
ALTER DATABASE YourDatabase SET MULTI_USER
이를 수행하기위한 스크립트, 'DB_NAME'을 데이터베이스로 바꾸어 다음에 대한 모든 연결을 종료하십시오.
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_NAME'
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
and spid <> @@SPID
했습니다 SELECT @sKillConnection
.
그것을 죽이고 불로 죽여라.
USE master
go
DECLARE @dbname sysname
SET @dbname = 'yourdbname'
DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END
SQL Management Studio Express 사용 :
개체 탐색기 트리에서 관리에서 "활동 모니터"로 드릴 다운합니다 (찾을 수 없으면 데이터베이스 서버를 마우스 오른쪽 단추로 클릭하고 "활동 모니터"를 선택하십시오). 활동 모니터를 열면 모든 프로세스 정보를 볼 수 있습니다. 관심있는 데이터베이스에 대한 잠금을 찾고 해당 잠금을 종료하면 연결이 끊어집니다.
그 후에 이름을 바꿀 수 있어야합니다.
오프라인 상태로 전환하는 데 시간이 걸리고 때로는 문제가 있습니다 ..
내 의견으로는 가장 확실한 방법 :
떼다 DB-> 작업-> 분리 ...를 마우스 오른쪽 단추로 클릭하십시오. "연결 끊기"를 확인하십시오. 확인
다시 연결 데이터베이스-> 첨부 ...를 마우스 오른쪽 단추로 클릭하십시오. 추가 ...-> 데이터베이스를 선택하고 다른 이름으로 첨부 열을 원하는 데이터베이스 이름으로 변경하십시오. 확인
Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'
Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((
select ' ' + KillCommand from #temp
FOR XML PATH('')),1,1,'')
Execute sp_executesql @query
Drop table #temp
'마스터'데이터베이스를 사용하고이 쿼리를 실행하면 데이터베이스에서 모든 활성 연결이 종료됩니다.
데이터베이스를 복원하려고 할 때 일반적으로 오류가 발생합니다. 일반적으로 Management Studio의 트리 맨 위로 이동하여 데이터베이스 서버를 마우스 오른쪽 버튼으로 클릭하고 다시 시작하십시오 (개발 시스템에 있기 때문에 프로덕션 환경에 이상적이지 않을 수 있음) ). 이것은 모든 데이터베이스 연결을 닫습니다.
ALTER DATABASE ... SET SINGLE_USER
다른 답변 의 명령은 동일한 '독점 잠금을 얻을 수 없습니다'오류를 반환했습니다).
또 다른 "화재로 죽이기"접근 방식은 MSSQLSERVER 서비스를 다시 시작하는 것입니다. 나는 커맨드 라인에서 물건을 좋아합니다. 이것을 CMD에 정확하게 붙여 넣으면 다음과 같이됩니다. NET STOP MSSQLSERVER & NET START MSSQLSERVER
또는 "services.msc"를 열고 "SQL Server (MSSQLSERVER)"를 찾아 마우스 오른쪽 단추로 클릭 한 후 "다시 시작"을 선택하십시오.
이렇게하면 해당 인스턴스에서 실행중인 모든 데이터베이스에 대한 모든 연결이 "확실히"종료됩니다.
(서버 / 데이터베이스의 구성을 변경하고 다시 변경하는 많은 접근 방식보다 이것을 좋아합니다)
MS SQL Server Management Studio 2008에서 이러한 종류의 작업을 안정적으로 수행하는 방법은 다음과 같습니다 (다른 버전에서도 작동 할 수 있음).
이 시나리오에서 나를 위해 일하는 옵션은 다음과 같습니다.
이 시도:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
SQL Server 2008 R2를 사용하고 있는데 DB가 이미 단일 사용자 용으로 설정되어 있으며 데이터베이스에 대한 작업을 제한하는 연결이있었습니다. 따라서 권장되는 SQLMenace 솔루션이 오류로 응답했습니다. 내 경우에 효과가 있었던 것이 하나있다 .
sp_who를 사용하여 데이터베이스의 모든 프로세스 목록을 가져옵니다. 어떤 프로세스를 종료할지 검토하고 싶을 수 있기 때문에이 방법이 더 좋습니다.
declare @proc table(
SPID bigint,
Status nvarchar(255),
Login nvarchar(255),
HostName nvarchar(255),
BlkBy nvarchar(255),
DBName nvarchar(255),
Command nvarchar(MAX),
CPUTime bigint,
DiskIO bigint,
LastBatch nvarchar(255),
ProgramName nvarchar(255),
SPID2 bigint,
REQUESTID bigint
)
insert into @proc
exec sp_who2
select *, KillCommand = concat('kill ', SPID, ';')
from @proc
결과
KillCommand 열의 명령을 사용하여 원하는 프로세스를 종료 할 수 있습니다.
SPID KillCommand
26 kill 26;
27 kill 27;
28 kill 28;
SP_Who 명령을 사용하여 데이터베이스를 사용하는 모든 프로세스를 종료 한 다음 데이터베이스 이름을 바꿀 수 있습니다.