sql - 即使已登录也删除 SQL 登录

标签 sql sql-server sql-server-2008

在集成测试执行过程中删除 SQL Server 2008 登录名时,有时会出现以下错误:

System.Data.SqlClient.SqlException: Could not drop login 'SomeTestUser' as the user is currently logged in.

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

最佳答案

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

关于sql - 即使已登录也删除 SQL 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4965260/

相关文章:

sql-server - MSMQ 作为 SQL Server 插入的缓冲区

sql - 比较sql中的逗号分隔值

php - 使用php连接的SQL Server地址

sql - ORACLE SQL 比较同一表中的两行或多行

sql - 使用包含空值列的 WHERE 子句更新语句

c# - 将数组存储在数据库中

c# - 将数据库从 SQL Server 2005 更改为 SQL Server 2008

mysql - SQL查询: Update single attribute (column) value to k different values

SQL Agent 显示 "SQL Agent XPs Disabled"但它们不是

sql-server - 什么时候使用什么函数 vs Sprocs