我正在设计一个应用程序,我正在寻找告诉谁当前登录SQL服务器的最佳方法。我将使用SSMS内置的Activity Monitor,它显示了访问服务器的所有进程的列表 - 非常酷。
但是,如果在我的.NET代码中每次访问数据库时它都使用单独的连接,那么我如何能够告诉谁当前已登录?如果用户只是在看屏幕而当时没有从数据库中检索数据,那么它们就不会显示正确吗?
答案 0 :(得分:17)
在MSSQL服务器中,您可以运行以下命令...
exec sp_who2
这将为您提供大量信息,包括登录的人员,应用程序名称,当前命令等等。
由于
答案 1 :(得分:10)
也许,也许不是。你是正确的,登录你的应用程序不需要用户登录数据库 - 事实上,这个概念并不存在。 Activity Montitor(以及有用的sp_who2)将仅显示活动连接 - 这些连接正在使用中。
如果您使用池化连接,那么该图片会发生变化(我相信,在您的连接字符串中,“Pooled = true”)。这样做,“关闭”的客户端连接将保持活动状态,您将在监视器中看到该连接。 This article有更详细的信息。
如果我是你,我会设计一种跟踪活跃用户的不同方式,一种不依赖池化连接的用户。
答案 2 :(得分:6)
DMV sys.dm_exec_sessions可用于查找已连接的会话。您可以将其加入sys.dm_exec_requests以获取请求信息(如果它正在运行),或者获取可以加入sys.dm_exec_connections的连接特定信息。 session_id用于所有连接。
我个人在旧的sp_who存储过程中使用DMV。正如其他人所指出的,如果连接关闭,你将看不到它,所以如果你想在连接之间进行跟踪,你必须考虑另一种缓存连接信息的方法。
答案 3 :(得分:3)
我认为您正在寻找sp_who
或sp_who2
答案 4 :(得分:2)
您的断言是正确的,用户不执行数据库操作将不可见。您确实需要手动存储某种“登录用户”信息。
答案 5 :(得分:2)
你是对的。如果编码正确,将在保存或检索数据时创建连接,并在之后立即关闭。
假设您对登录应用程序的人员比登录数据库服务器的人更感兴趣,您可以在数据库中保留会话信息,包括用户ID。然后,您可以简单地查询会话数据库以发现谁在线。根据您使用的开发技术,可能有更好的解决方案。