我们让用户忘记关闭使用我们的SQL 2014数据库的访问查询。发生这种情况时,它会阻止他们访问的表重建过夜。有没有办法杀死这些用户而不是杀死系统进程。根据我的阅读,系统流程不仅限于SPID> 50。
答案 0 :(得分:2)
基于spid>=50
杀死用户流程似乎不可靠。
来自Adam Machanic:Smashing a DMV Myth: session_id > 50 == User Process
最近在MVP邮件列表上的对话显示,这个神奇的数字虽然可能曾经是合法的过滤器,但在SQL Server 2005或SQL Server 2008中使用肯定是不安全的。有几个系统功能可以 - 并且将会 - 使用会话ID大于50,因为没有足够的空间。
示例包括:
也可能有其他情况。 重点是,数字50不再是过滤掉系统会话ID的有效方法。
所以你的选择是
SELECT *
FROM sys.dm_exec_sessions
WHERE
is_user_process = 1
SELECT *
FROM sys.sysprocesses
WHERE
hostprocess > ''
您可以使用上面的查询来获取除系统之外的spid / session,并使用kill命令来终止它们
答案 1 :(得分:0)
我认为应该可以使用sp_who和KILL,从sp_who查看登录名,主机名等
答案 2 :(得分:0)
我们让用户忘记关闭使用我们的访问查询 SQL 2014数据库。当发生这种情况时,它会阻止它们的表 从重建过夜进入。
您可以在开始维护之前将数据库置于single user
模式(立即回滚),然后置于multi user
。将回滚所有用户事务。
答案 3 :(得分:0)
此存储过程可以正常工作并终止挂起访问查询,并且不会终止系统进程。
DECLARE @v_spid INT
DECLARE c_Users CURSOR
FAST_FORWARD FOR
SELECT SPID
FROM master..sysprocesses (NOLOCK)
WHERE spid>50
AND status='sleeping'
AND DATEDIFF(mi,last_batch,GETDATE())>=60
AND spid<>@@spid
OPEN c_Users
FETCH NEXT FROM c_Users INTO @v_spid
WHILE (@@FETCH_STATUS=0)
BEGIN
PRINT 'KILLing '+CONVERT(VARCHAR,@v_spid)+'...'
EXEC('KILL '+@v_spid)
FETCH NEXT FROM c_Users INTO @v_spid
END
CLOSE c_Users
DEALLOCATE c_Users