Удаление БД SQL Server (MS SQL)
Есть данный скрипт, для удаления БД
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", так как она используется в данный момент."
Помогите исправить скрипт, чтобы можно было удалить БД, даже если есть активные соединения
Ответы (1 шт):
Автор решения: Beneviento
→ Ссылка
Сделал следующим образом, все работает
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