Как указать "закрыть существующие соединения" в 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.


Если вы щелкните правой кнопкой мыши на базе данных в области обозревателя объектов и выберите задачу удалить из контекстного меню, есть флажок, который "закрыть существующие соединения"



есть ли способ указать эту опцию в моем скрипте?

609   5  

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

    Ничего не найдено.