Это в теории. А на практике часто при выполнении команды, особенно из стороннего приложения, можно увидеть следующее:
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]" при необходимости.
Комментариев нет:
Отправить комментарий