SQL Server 2008 R2: удаление базы данных при условии
Теперь я пытаюсь удалить базу данных из моего SQL Server на основе любого условия (например, внутри блока IF). Если база данных существует, удалите и создайте ее заново.
Я использую следующий код:
IF EXISTS (SELECT 1 FROM sys.databases db with(nolock) WHERE db.name = 'practice')
BEGIN
USE master
DROP DATABASE practice
END
Этот код продолжает выполняться в течение пары минут, а затем отвечает с ошибкой, говоря
Сообщение 3702, уровень 16, состояние 4, строка 1
Невозможно удалить базу данных "практика", потому что она в настоящее время используется.
Затем для другой попытки я использовал инструкцию GO в своем коде, чтобы отделить поток выполнения, со следующим кодом (ПРИМЕЧАНИЕ, это также создает оператор базы данных):
IF EXISTS (SELECT 1 FROM sys.databases db with(nolock) WHERE db.name = 'practice')
BEGIN
USE master
GO
DROP DATABASE practice
GO
CREATE DATABASE practice
END
Теперь он выдает эту ошибку:
Сообщение 102, Уровень 15, Состояние 1, Строка 3
Неверный синтаксис рядом с "master".
Сообщение 3702, уровень 16, состояние 4, строка 1
Невозможно удалить базу данных "практика", потому что она в настоящее время используется.
Сообщение 102, Уровень 15, Состояние 1, Строка 2
Неверный синтаксис рядом с 'END'
Я не знаю, что я что-то упустил или есть обходной путь, который нужно сделать.
Кроме того, я был бы заинтересован в лучших альтернативах для этой цели, если таковые имеются.
Я не знаю, возможно ли это вообще.
С уважением, Шенкс
3 ответа
Вы также можете сделать
sp_who2
чтобы увидеть, кто или что связано с этой БД. Затем вы можете использовать
KILL SPID# (i.e. "KILL 54")
заставить эту связь закрыться. Это опасно, если вы находитесь в производстве, но если вы все равно сбрасываете и воссоздаете БД...
Это немного более хирургически, чем то, что предлагает @TheGameiswar, но очень похоже.
Для целей практики можно использовать следующий код:
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'practice'
GO
USE [master]
GO
ALTER DATABASE [practice] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DROP DATABASE [practice]
GO
Теперь вы можете создать свою новую базу данных.
Как следует из сообщения об ошибке, база данных используется. Вы можете принудительно удалить базы данных, используя скрипт ниже
if exists(select * from sys.sysdatabases where name ='test')
begin
use master;
alter database test
set single_user with rollback immediate;
drop database test;
end