Скрипт для уничтожения всех соединений с базой данных (больше чем RESTRICTED_USER ROLLBACK) - PullRequest
193 голосов
/ 26 августа 2011

У меня есть база данных разработки, которая часто переустанавливается из проекта базы данных Visual Studio (через TFS Auto Build).

Иногда, когда я запускаю свою сборку, я получаю эту ошибку:

ALTER DATABASE failed because a lock could not be placed on database 'MyDB'. Try again later.  
ALTER DATABASE statement failed.  
Cannot drop database "MyDB" because it is currently in use.  

Я пробовал это:

ALTER DATABASE MyDB SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE

, но я все еще не могу удалить базу данных.(Я предполагаю, что большинство разработчиков имеют доступ dbo.)

Я могу вручную запустить SP_WHO и начать уничтожать соединения, но мне нужен автоматический способ сделать это в автоматической сборке.(Хотя на этот раз мое соединение является единственным в БД, который я пытаюсь сбросить.)

Существует ли сценарий, который может удалить мою базу данных независимо от того, кто подключен?

Ответы [ 12 ]

0 голосов
/ 27 июня 2018
SELECT
    spid,
    sp.[status],
    loginame [Login],
    hostname, 
    blocked BlkBy,
    sd.name DBName, 
    cmd Command,
    cpu CPUTime,
    memusage Memory,
    physical_io DiskIO,
    lastwaittype LastWaitType,
    [program_name] ProgramName,
    last_batch LastBatch,
    login_time LoginTime,
    'kill ' + CAST(spid as varchar(10)) as 'Kill Command'
FROM master.dbo.sysprocesses sp 
JOIN master.dbo.sysdatabases sd ON sp.dbid = sd.dbid
WHERE sd.name NOT IN ('master', 'model', 'msdb') 
--AND sd.name = 'db_name' 
--AND hostname like 'hostname1%' 
--AND loginame like 'username1%'
ORDER BY spid

/* If a service connects continously. You can automatically execute kill process then run your script:
DECLARE @sqlcommand nvarchar (500)
SELECT @sqlcommand = 'kill ' + CAST(spid as varchar(10))
FROM master.dbo.sysprocesses sp 
JOIN master.dbo.sysdatabases sd ON sp.dbid = sd.dbid
WHERE sd.name NOT IN ('master', 'model', 'msdb') 
--AND sd.name = 'db_name' 
--AND hostname like 'hostname1%' 
--AND loginame like 'username1%'
--SELECT @sqlcommand
EXEC sp_executesql @sqlcommand
*/
0 голосов
/ 20 мая 2014

Я успешно протестировал с простым кодом ниже

USE [master]
GO
ALTER DATABASE [YourDatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...