Убедитесь, что у вас нет зависимостей, таких как снимки базы данных, в БД, которую вы хотите удалить. Хотя сообщение об ошибке выглядело бы иначе. Вы уверены, что нет скрытого процесса, который подключается к вашей базе данных? Хорошим подходом было бы запустить скрипт, который убивает все сеансы и сразу же после переименования базы данных на другое имя, а затем удалить базу данных.
создать курсор на основе этого выбора:
select d.name , convert (smallint, req_spid) As spid
from master.dbo.syslockinfo l,
master.dbo.spt_values v,
master.dbo.spt_values x,
master.dbo.spt_values u,
master.dbo.sysdatabases d
where l.rsc_type = v.number
and v.type = 'LR'
and l.req_status = x.number
and x.type = 'LS'
and l.req_mode + 1 = u.number
and u.type = 'L'
and l.rsc_dbid = d.dbid
and rsc_dbid = (select top 1 dbid from
master..sysdatabases
where name like 'my_db')
проблема внутри курсора:
SET @kill_process = 'KILL ' + @spid
EXEC master.dbo.sp_executesql @kill_process
PRINT 'killed spid : '+ @spid
после того, как курсор закрыт и освобожден:
sp_dboption 'my_db', 'single user', 'TRUE'
go
sp_renamedb 'my_db', 'my_db_old'
go
DROP DATABASE MY_DB_OLD
Сеанс, подключенный к другой базе данных, может иметь открытую транзакцию, которая также влияет на вашу базу данных - sp_who2 покажет только одну базу данных. Это также может быть что-то такое же простое, как Object Explorer или Object Explorer Details, открытые в SSMS, которые снова будут показывать только одну базу данных в sp_who2.
Не пытайтесь найти ответственную сессию; просто убейте их всех одним оператором (и убедитесь, что подключена не ваша копия SSMS, например, другое окно запроса, обозреватель объектов и т. д.):
Теперь вы сможете удалить его и сделать это с помощью DDL, а не пользовательского интерфейса:
источник
USE master
, это тогдаDROP DATABASE dbname
. Очевидно, все, что нужно, это просто «использовать» что-то еще, чтобы освободить БД.Какая у вас база данных, когда вы вводите
DROP
команду? Попробуй это:Также убедитесь, что вы подключены, а
sa
неdbo
к той базе данных, которую хотите удалить.источник
Как насчет того, чтобы увидеть, что делает SSMS, когда вы используете пользовательский интерфейс, но сказать ему, чтобы он выдал сценарий для действия? Вот что делает SSMS, когда вы щелкаете правой кнопкой мыши по БД и выбираете Удалить, затем устанавливаете флажок, чтобы закрыть существующие соединения:
источник
Я сталкивался с этой ситуацией много раз, и вот что я делаю ниже:
Когда очевидные методы не работают ..... (как в вашей ситуации):
Узнайте идентификатор базы данных из системной базы данных.
Затем выполните -
sp_lock
это покажет все блокировки на экземпляре вместе с spid и dbid.Убейте спидов с помощью dbid, который вы пытаетесь отключить или сбросить.
Хотя этот процесс немного ручной, его можно автоматизировать, как показано ниже:
источник
Нашел действительно простой ответ на StackOverflow, который работал для меня впервые:
https://stackoverflow.com/a/7469167/261405
Вот SQL из этого ответа:
источник