Удаление БД SQL Server

Рейтинг: -1Ответов: 1Опубликовано: 07.06.2023

Есть данный скрипт, для удаления БД

use master
go
declare @dbnames nvarchar(max)
declare @statement nvarchar(max)
set @dbnames = ''
set @statement = ''
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases 
    where name 
    NOT IN ('test', 'master', 'model', 'msdb', 'tempdb') 
    AND name NOT LIKE '%AdventureWorks%' -- Database to keep 
    AND name NOT LIKE '%DW%' -- Data warehouse database
    AND name NOT LIKE '%ReportServer%' -- Report server database
if len(@dbnames) = 0
    begin
    print 'no databases to drop'
    end
else
    begin
    set @statement = 'drop database ' + substring(@dbnames, 2, len(@dbnames))
    print @statement
    exec sp_executesql @statement
    end
go

При запуске скрипт работает, но если есть активное соединение (кто-то работает в момент запуска скрипта) , то скрипт выдает ошибку

"Невозможно удалить базу данных "DBDB", так как она используется в данный момент."

Помогите исправить скрипт, чтобы можно было удалить БД, даже если есть активные соединения

Ответы

▲ 0Принят

Сделал следующим образом, все работает

USE master
GO

DECLARE @dbnames NVARCHAR(MAX)
DECLARE @statement NVARCHAR(MAX)
SET @dbnames = ''
SET @statement = ''

SELECT @dbnames = @dbnames + ',[' + name + ']' FROM sys.databases
WHERE name NOT IN ('test', 'master', 'model', 'msdb', 'tempdb')
    AND name NOT LIKE '%AdventureWorks%' -- База данных, которую нужно сохранить
    AND name NOT LIKE '%DW%' -- База данных хранилища данных
    AND name NOT LIKE '%ReportServer%' -- База данных сервера отчетов

IF LEN(@dbnames) = 0
BEGIN
    PRINT 'Нет баз данных для удаления'
END
ELSE
BEGIN
    SET @statement = 'USE master; ALTER DATABASE ' + SUBSTRING(@dbnames, 2, 
    LEN(@dbnames)) + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE;'
    EXEC sp_executesql @statement


    SET @statement = 'USE master; DROP DATABASE ' + SUBSTRING(@dbnames, 2, 
LEN(@dbnames))
    PRINT @statement
    EXEC sp_executesql @statement
END
GO