Как указать "закрыть существующие соединения" в SQL-скрипте
Я занимаюсь активной разработкой своей схемы в SQL Server 2008 и часто хочу перезапустить свой сценарий drop/create database. Когда я бегу
USE [master]
GO
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'MyDatabase')
DROP DATABASE [MyDatabase]
GO
Я часто получаю эту ошибку
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "MyDatabase" because it is currently in use.
Если вы щелкните правой кнопкой мыши на базе данных в области обозревателя объектов и выберите задачу удалить из контекстного меню, есть флажок, который "закрыть существующие соединения"
есть ли способ указать эту опцию в моем скрипте?
5 ответов:
вы можете отключить всех и откатить их транзакции с помощью:
alter database [MyDatbase] set single_user with rollback immediateпосле этого можно смело сбрасывать базу данных:)
перейдите в Management studio и сделайте все, что вы описываете, только вместо того, чтобы нажимать OK, нажмите на скрипт. Он покажет код, который он будет запускать, который вы можете включить в свои скрипты.
в этом случае, вы хотите:
ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO
по словам ALTER DATABASE SET документация, есть еще возможность, что после установки базы данных в режим SINGLE_USER вы не сможете получить доступ к этой базе данных:
перед установкой базы данных в значение SINGLE_USER убедитесь, что параметр AUTO_UPDATE_STATISTICS_ASYNC имеет значение OFF. При установке на фоновый поток, используемый для обновления статистики, подключение к базе данных, и вы не сможете получить доступ к базе данных в однопользовательском режим.
Итак, полный скрипт для удаления базы данных с существующими соединениями может выглядеть так:
DECLARE @dbId int DECLARE @isStatAsyncOn bit DECLARE @jobId int DECLARE @sqlString nvarchar(500) SELECT @dbId = database_id, @isStatAsyncOn = is_auto_update_stats_async_on FROM sys.databases WHERE name = 'db_name' IF @isStatAsyncOn = 1 BEGIN ALTER DATABASE [db_name] SET AUTO_UPDATE_STATISTICS_ASYNC OFF -- kill running jobs DECLARE jobsCursor CURSOR FOR SELECT job_id FROM sys.dm_exec_background_job_queue WHERE database_id = @dbId OPEN jobsCursor FETCH NEXT FROM jobsCursor INTO @jobId WHILE @@FETCH_STATUS = 0 BEGIN set @sqlString = 'KILL STATS JOB ' + STR(@jobId) EXECUTE sp_executesql @sqlString FETCH NEXT FROM jobsCursor INTO @jobId END CLOSE jobsCursor DEALLOCATE jobsCursor END ALTER DATABASE [db_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE [db_name]
я попробовал то, что hgmnz говорит на SQL Server 2012.
управление создано для меня:
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'MyDataBase' GO USE [master] GO /****** Object: Database [MyDataBase] Script Date: 09/09/2014 15:58:46 ******/ DROP DATABASE [MyDataBase] GO
Я знаю, что это слишком поздно, но может быть поможет кому-то одному. при использовании этого возьмите вашу базу данных в автономном режиме
ALTER DATABASE dbname SET OFFLINE
Comments