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