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

Posted

技术标签:

【中文标题】即使在登录时也删除 SQL 登录【英文标题】:Drop SQL login even while logged in 【发布时间】:2011-02-11 03:11:29 【问题描述】:

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

System.Data.SqlClient.SqlException: 无法将登录名“SomeTestUser”删除为 用户当前已登录。

我不在乎它是否已登录 - 我仍然想删除它。最简单的方法是什么?

【问题讨论】:

【参考方案1】:

好的,这是我想出的脚本,它对我有用。请注意,您需要成为 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 [用户]

【讨论】:

无法杀死自己的进程 我相信最初的问题是关于放弃登录,而不是你自己的。我已经有一段时间没有使用 SQL 服务器了,所以如果你想放弃自己的登录名,我无法告诉你该怎么做。也许只需注销您登录的所有窗口。 如果需要过滤sp_who2的结果,看一下这个帖子:***.com/questions/2234691/…【参考方案3】:

通过识别用户的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 server management studio 选项来删除登录。

DROP LOGIN 'test'

【讨论】:

【参考方案4】:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

正如 SqlACID 所说,或者您可以找到所有进程并一次杀死一个然后删除用户

【讨论】:

顺便说一句,如果您需要将数据库恢复到其原始状态,请使用带有 MULTI_USER 选项的相同命令。参照。 docs.microsoft.com/en-us/sql/t-sql/statements/…【参考方案5】:

这可能并不总是适用,但我刚刚从服务中重新启动了 SQL 服务器。这清除了所有打开的连接。

【讨论】:

我还必须通过服务重启删除数据库 为了摆脱单个登录名/用户而重新启动实例是不是有点矫枉过正? 当然可以,但我发现它是开发时最简单的方法。【参考方案6】:

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

【讨论】:

是的,我这样做。事实上,我实际上是先删除了他们的数据库,但有时(非常罕见)仍然会出现此错误。 我想你可以从 sys.sysprocesses 获取帐户连接的 spid 并构建一个 'KILL'+ spid 语句来执行。

以上是关于即使在登录时也删除 SQL 登录的主要内容,如果未能解决你的问题,请参考以下文章

jHipster - 即使从实体中删除权限,AngularJS 路由也会重定向到登录

把windows验证用户删除了,新建sql验证用户无法登录。

即使用户在android studio中关闭应用程序,如何保持登录状态

IIS 7.5 即使在禁用时也使用模拟

如何使用 aws amplify 保持用户登录 react-native

Swift & Facebook 登录:我的 UIViewController 不符合 FBSDKLoginButtonDelegate