44 votes

Abandon de la connexion SQL même si l'on est connecté

Lors de l'abandon d'un login SQL Server 2008 dans le cadre de l'exécution d'un test d'intégration, j'obtiens parfois l'erreur suivante :

System.Data.SqlClient.SqlException : Could not drop login 'SomeTestUser' as l'utilisateur est actuellement connecté.

Je me fiche de savoir s'il est connecté, je veux quand même le faire tomber. Quel est le moyen le plus simple de le faire ?

59voto

EMP Points 17246

OK, voici le script que j'ai trouvé, qui a fonctionné pour moi. Notez que vous devez être membre du groupe de travail processadmin pour trouver et interrompre la connexion et un membre de l'équipe de gestion de la sécurité. securityadmin pour abandonner le login. (Bien sûr, sysadmin peut faire n'importe quoi).

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

11voto

Darren G Points 93

L'utilisateur peut être supprimé après avoir tué la session en identifiant le session_id de l'utilisateur.

SELECT session_id
FROM sys.dm_exec_sessions
WHERE login_name = 'test'

KILL 69  --69 is session_id here, you may get different id

Maintenant vous pouvez supprimer le login simplement en exécutant la requête ci-dessous (ou) en utilisant les options de sql server management studio.

DROP LOGIN 'test'

9voto

pasx Points 141

Dans SqlServer Studio, sur la BD Maître.

Utilisez la commande sp_who2 pour lister les sessions ouvertes.

Dans la liste, trouvez le spid de votre utilisateur - il peut y en avoir plusieurs - par exemple 999.

Utilisez kill et le spid pour fermer toutes les sessions e.g. : kill 999

Puis DROP LOGIN [theuser]

4voto

Kris Ivanov Points 5350
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

comme SqlACID l'a dit, ou vous pouvez trouver tous les processus et en tuer un à la fois, puis abandonner l'utilisateur.

3voto

Tiele Declercq Points 454

Ce n'est peut-être pas toujours applicable mais je viens de redémarrer le serveur SQL à partir des services. Cela a éliminé toutes les connexions ouvertes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X