2011-02-11 16 views
19

Al dejar un 2008 de sesión de SQL Server como parte de la ejecución de pruebas de integración a veces me sale el siguiente error:entrada gota SQL, incluso mientras está conectado

System.Data.SqlClient.SqlException: Could not drop login 'SomeTestUser' as the user is currently logged in.

No me importa si está conectado - Todavía quiero para dejarlo caer. ¿Cuál es la forma más fácil de hacer esto?

Respuesta

1

Si sabe a qué base de datos se conectarán, puede establecer la base de datos en modo de usuario único, con reversión inmediata, que abandonará sus sesiones.

+0

Sí, hago esto. De hecho, en realidad dejo caer su base de datos primero, pero a veces (muy raramente) este error aún ocurre. – EMP

+0

Supongo que podría obtener el spid de las conexiones de la cuenta desde sys.sysprocesses y construir una instrucción 'KILL' + spid para ejecutar. – SqlACID

0
ALTER DATABASE [DATABASE_NAME] 
SET SINGLE_USER 
WITH ROLLBACK IMMEDIATE 

como dijo SqlACID, o se puede encontrar todos los procesos y matar a uno a la vez y luego soltar usuario

35

OK, aquí está la secuencia de comandos que se me ocurrió, que trabajó para mí. Tenga en cuenta que debe ser miembro de la función de servidor processadmin para encontrar y eliminar la conexión y miembro de securityadmin para soltar el inicio de sesión. (Por supuesto, administrador de sistemas puede hacer nada.)

DECLARE @loginNameToDrop sysname 
SET @loginNameToDrop = '<victim login ID>'; 

DECLARE sessionsToKill CURSOR FAST_FORWARD FOR 
    SELECT session_id 
    FROM sys.dm_exec_sessions 
    WHERE login_name = @loginNameToDrop 
OPEN sessionsToKill 

DECLARE @sessionId INT 
DECLARE @statement NVARCHAR(200) 

FETCH NEXT FROM sessionsToKill INTO @sessionId 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT 'Killing session ' + CAST(@sessionId AS NVARCHAR(20)) + ' for login ' + @loginNameToDrop 

    SET @statement = 'KILL ' + CAST(@sessionId AS NVARCHAR(20)) 
    EXEC sp_executesql @statement 

    FETCH NEXT FROM sessionsToKill INTO @sessionId 
END 

CLOSE sessionsToKill 
DEALLOCATE sessionsToKill 

PRINT 'Dropping login ' + @loginNameToDrop 
SET @statement = 'DROP LOGIN [' + @loginNameToDrop + ']' 
EXEC sp_executesql @statement 
3

Esto no siempre puede ser aplicable, pero acabo de reiniciar el servidor SQL de servicios. Eso despejó cualquier conexión abierta.

+0

Tuve que eliminar también las bases de datos con el servicio reiniciar – Brent

+2

¿No es un poco excesivo rehacer para reiniciar la instancia solo para deshacerse de un solo inicio de sesión/usuario? –

+2

Por supuesto que lo es, pero creo que es el método más fácil cuando está en desarrollo. –

5

En SqlServer Studio en la base de datos maestra.

Utilice el comando sp_who2 para enumerar las sesiones abiertas.

En la lista, encuentre el spid para su usuario; puede haber más de uno, p. 999

Uso matar y el SPID para cerrar todas las sesiones ej .: matan a 999

a continuación, colocar LOGIN [theuser]

Cuestiones relacionadas