Выйти из SQL-запроса даже при входе в систему
При удалении входа в SQL Server 2008 как часть выполнения теста интеграции иногда возникает следующая ошибка:
System.Data.SqlClient.SqlException: Не удалось удалить логин 'SomeTestUser' как пользователь в настоящее время вошел в систему.
Мне все равно, если он войдет в систему - я все равно хочу его отбросить. Какой самый простой способ сделать это?
Ответы
Ответ 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'