Подтвердить что ты не робот

Выйти из SQL-запроса даже при входе в систему

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

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

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

4b9b3361

Ответ 1

ОК, здесь script я придумал, что сработало для меня. Обратите внимание, что вам нужно быть членом роли сервера 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

Ответ 2

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

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

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

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

Затем DROP LOGIN [theuser]

Ответ 3

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

Ответ 4

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

Ответ 5

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

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

Ответ 6

Пользователь может быть удален после убийства сеанса путем идентификации 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'