Отбрасывать логин SQL даже во время входа - PullRequest
29 голосов
/ 11 февраля 2011

При отбрасывании имени входа SQL Server 2008 как части выполнения интеграционного теста я иногда получаю следующую ошибку:

System.Data.SqlClient.SqlException: Не удалось удалить имя пользователя «SomeTestUser» как пользовательв настоящее время вошел в систему.

Мне все равно, если он вошел - я все еще хочу отбросить его.Какой самый простой способ сделать это?

Ответы [ 6 ]

45 голосов
/ 03 марта 2011

ОК, вот сценарий, который я придумал, который работал для меня.Обратите внимание, что вам нужно быть участником серверной роли processadmin , чтобы найти и уничтожить соединение, и членом securityadmin , чтобы сбросить имя входа.(Конечно, sysadmin может делать все что угодно.)

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
8 голосов
/ 10 февраля 2015

В SqlServer Studio на главной базе данных.

Используйте команду sp_who2 для просмотра списка открытых сессий.

В списке найдите spid для вашего пользователя - их может быть больше одного -например, 999

Используйте kill и spid для закрытия всех сессий, например: kill 999

Затем DROP LOGIN [theuser]

3 голосов
/ 05 февраля 2014

Это не всегда применимо, но я только что перезапустил SQL-сервер из служб. Это очистило все открытые соединения.

2 голосов
/ 24 июня 2019

Пользователь может быть удален после прекращения сеанса, идентифицируя session_id пользователя.

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

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

Теперь вы можете удалить имя пользователя, просто выполнив приведенный ниже запрос (или) с помощью параметров студии управления сервером sql.

DROP LOGIN 'test'
2 голосов
/ 11 февраля 2011
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

, как сказал SqlACID, или вы можете найти все процессы и убить по одному, а затем удалить пользователя

2 голосов
/ 11 февраля 2011

Если вы знаете, к какой базе данных они будут подключены, вы можете установить базу данных в однопользовательский режим с немедленным откатом, который прекратит их сеансы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...