среда, 1 декабря 2010 г.

DROP DATABASE: Msg 3702 Cannot drop database because it is currently in use.

DROP DATABASE database_name; удаляет базу данных или моментальный снимок базы данных.
Это в теории. А на практике часто при выполнении команды, особенно из стороннего приложения, можно увидеть следующее:

USE [master];

IF EXISTS (SELECT name FROM sys.databases WHERE name = N'database_name')
BEGIN
DROP DATABASE [database_name];
END

Msg 3702, Level 16, State 4, Line 2
Cannot drop database "SimpleGalleryDB" because it is currently in use.

А всё потому, что база данных и вправду используется. К базе могут быть незакрытые подключения, обращения, запросы, зачастую, неявные.
В интернете встречал советы по тому, как выбрать и удалить все подключения к данной БД перед её удалением. Но конструкции получались слишком громоздкими. Я предлагаю более простой и работающий вариант:

USE [master];

IF EXISTS (SELECT name FROM sys.databases WHERE name = N'database_name')
BEGIN
ALTER DATABASE [database_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE [database_name];
END

База данных успешно удалиться. Предшествующая удалению команда переводит БД в режим SINGLE_USER, в котором возможен только один коннект к БД. В таком режиме БД можно уже удалять.

P.S. При удалении БД из приложения в свойстве Initial Catalog я прописывал master, но не думаю, что это обязательно. Хотя, по-моему, логично. И всегда можно использовать в SQL-команде "USE [database_name]" при необходимости.

Комментариев нет:

Отправить комментарий