2009-11-10 37 views
120

Estoy haciendo un desarrollo activo en mi esquema en SQL Server 2008 y con frecuencia quiero volver a ejecutar mi script de soltar/crear la base de datos. Cuando corroCómo especifico "cerrar conexiones existentes" en el script sql

USE [master] 
GO 

IF EXISTS (SELECT name FROM sys.databases WHERE name = N'MyDatabase') 
DROP DATABASE [MyDatabase] 
GO 

A menudo recibo este error

Msg 3702, Level 16, State 4, Line 3 
Cannot drop database "MyDatabase" because it is currently in use. 

Si hace clic derecho sobre la base de datos en el panel Explorador de objetos y seleccionar la tarea Eliminar del menú de contexto, hay una casilla para "cerrar conexiones existentes"

¿Hay alguna manera de especificar esta opción en mi script?

Respuesta

189

Puede desconectar todos y hacer retroceder sus transacciones con:

alter database [MyDatbase] set single_user with rollback immediate 

Después de eso, se puede eliminar con seguridad la base de datos :)

+4

he utilizado esto, pero a menudo se preguntaba si había una ventana de oportunidad para otro usuario a entrar, ya que el "usuario único" - es posible? La alternativa posible es ALTER DATABASE [MyDatabaseName] SET OFFLINE WITH ROLLBACK INMEDIATE – Kristen

+7

El usuario en single_user eres tú; a menos que se desconecte después de configurar el modo de usuario único. Entonces uno (1) otro usuario puede iniciar sesión. – Andomar

+0

Gracias; tiene sentido. – Kristen

29

Ir al estudio de la gestión y hacer todo lo que usted describe, sólo que en lugar de haciendo clic en Aceptar, haga clic en Script. Mostrará el código que ejecutará, que luego podrá incorporar a sus scripts.

En este caso, desea:

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
+1

I was goin g para tratar de responder esta pregunta haciendo exactamente lo que describes (creando el diálogo "borrar base de datos") pero ** no ** agrega la línea ALTER DATABASE al script si seleccionas la casilla "cerrar las conexiones existentes". –

+0

La secuencia de comandos generada desde el asistente incluía la línea 'modificar base de datos' para mí. – nick

+0

Extraño. ¿Qué versión de Management Studio? Estoy en 2008 x64. –

12

De acuerdo con la documentación ALTER DATABASE SET, todavía hay una posibilidad de que después de establecer una base de datos a modo de SINGLE_USER usted no será capaz de acceder a esa base de datos:

Antes de establecer la base de datos en SINGLE_USER, verifique que la opción AUTO_UPDATE_STATISTICS_ASYNC esté establecida en OFF. Cuando se establece en ON, el hilo de fondo usado para actualizar las estadísticas toma una conexión en contra de la base de datos y usted no podrá acceder a la base de datos en modo de usuario único.

Por lo tanto, una secuencia de comandos completa a caer la base de datos con conexiones existentes pueden tener este aspecto:

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] 
2

He probado lo hgmnz saids en SQL Server 2012.

de gestión creado para mí:

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 
+3

Esto no cerrará las conexiones activas. – Jens

+0

Asegúrate de marcar "Cerrar conexiones existentes"; Si te pones la declaración 'ROLLBACK INMEDIATO' se incluirá. La 'sp_delete_database_backuphistory' proviene de la verificación de" Eliminar la copia de seguridad y restaurar la información del historial de las bases de datos ". –

+0

La comprobación de "Cerrar conexiones existentes" no genera el 'ALTER DATABASE SET SINGLE_USER ...' si no hay conexiones actuales para cerrar. – ahwm

0

Sé que es demasiado tarde, pero puede ser que ayude a alguien. sobre el uso de esta toma su base de datos en línea

ALTER DATABASE dbname SET OFFLINE 
Cuestiones relacionadas