即使在登录时也删除SQL登录

EMP*_*EMP 33 sql sql-server sql-server-2008

在作为集成测试执行的一部分删除SQL Server 2008登录时,我有时会收到以下错误:

System.Data.SqlClient.SqlException:无法在用户当前登录时删除登录"SomeTestUser".

我不在乎它是否已登录 - 我仍然想放弃它.最简单的方法是什么?

EMP*_*EMP 50

好的,这是我提出的脚本,对我有用.请注意,您需要成为processadmin服务器角色的成员才能查找并终止该连接,并且需要securityadmin的成员才能删除该登录名.(当然,系统管理员可以做任何事情.)

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
Run Code Online (Sandbox Code Playgroud)


pas*_*asx 8

在主数据库上的SqlServer Studio中.

使用命令sp_who2列出已打开的会话.

在列表中找到您的用户的spid - 可能有多个 - 例如999

使用kill和spid来关闭所有会话,例如:kill 999

然后DROP LOGIN [用户]


小智 7

通过识别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
Run Code Online (Sandbox Code Playgroud)

现在,您只需使用 sql server management studio 选项执行以下查询(或)即可删除登录名。

DROP LOGIN 'test'
Run Code Online (Sandbox Code Playgroud)


Sql*_*CID 2

如果您知道他们将连接到哪个数据库,您可以将数据库设置为单用户模式,并立即回滚,这将删除他们的会话。