online español documentacion books sql sql-server

español - sql server reference



¿Cómo especifico "cerrar conexiones existentes" en scripts sql? (5)

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 corro

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

A menudo obtengo este error

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

Si hace clic derecho en la base de datos en el panel del explorador de objetos y selecciona la tarea Eliminar en el menú contextual, hay una casilla de verificación para "cerrar las conexiones existentes"

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


De acuerdo con la documentación ALTER DATABASE SET , aún existe la posibilidad de que después de establecer una base de datos en el modo SINGLE_USER no pueda acceder a esa base de datos:

Antes de configurar la base de datos en SINGLE_USER, verifique que la opción AUTO_UPDATE_STATISTICS_ASYNC esté desactivada. 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.

Entonces, una secuencia de comandos completa para soltar la base de datos con conexiones existentes puede verse así:

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]


Probé lo que dice hgmnz en SQL Server 2012.

Gestión creada 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


Puede desconectar a todos y deshacer sus transacciones con:

alter database [MyDatbase] set single_user with rollback immediate

Después de eso, puedes dejar caer la base de datos de forma segura :)


Sé que es demasiado tarde, pero puede ser que ayude a alguien. al usar esto, quite su base de datos

ALTER DATABASE dbname SET OFFLINE


Vaya a Management Studio y haga todo lo que describa, solo que en lugar de hacer clic en Aceptar, haga clic en Script. Mostrará el código que ejecutará, que luego podrá incorporar a sus scripts.

En este caso, quieres:

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO