corporativo - login failed for user sa microsoft sql server error 18456 sql server 2017
Soltar el inicio de sesión de SQL incluso mientras está conectado (5)
Al descartar un inicio de sesión de SQL Server 2008 como parte de la ejecución de la prueba de integración, a veces aparece el siguiente error:
System.Data.SqlClient.SqlException: No se pudo quitar el inicio de sesión ''SomeTestUser'' ya que el usuario está actualmente conectado.
No me importa si está conectado, todavía quiero dejarlo. ¿Cuál es la forma más fácil de hacer esto?
En SqlServer Studio en la base de datos principal.
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, por ejemplo, 999
Usa kill y el spid para cerrar todas las sesiones, por ejemplo: kill 999
Luego DROP LOGIN [theuser]
Es posible que esto no siempre sea aplicable, pero acabo de reiniciar el servidor SQL desde los servicios. Eso aclaró cualquier conexión abierta.
OK, aquí está el guión que se me ocurrió, que funcionó para mí. Tenga en cuenta que debe ser miembro de la función del servidor processadmin para encontrar y eliminar la conexión y un miembro de securityadmin para cancelar el inicio de sesión. (Por supuesto, sysadmin puede hacer cualquier cosa.)
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
Si sabe a qué base de datos se conectarán, puede establecer la base de datos en modo de usuario único, con una reversión inmediata, que eliminará sus sesiones.
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
como dijo SqlACID, o puede encontrar todos los procesos y eliminar uno a la vez y luego eliminar al usuario