首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得登录到SQL Server数据库的计算机的准确计数?

如何获得登录到SQL Server数据库的计算机的准确计数?
EN

Stack Overflow用户
提问于 2015-03-11 07:42:43
回答 2查看 554关注 0票数 1

我们按工作站数量许可我们的软件。

我有一个多年来一直使用的查询,用于获得登录到我的SQL Server数据库的工作站的准确计数。为简单起见,所有用户都使用相同的登录名/密码。这内置于附加到数据库的脚本中。他们只能访问该数据库,但

代码语言:javascript
复制
USE [Master] GRANT VIEW SERVER STATE to MyUser

已经生效的查询如下:

代码语言:javascript
复制
SELECT COUNT(Users) AS UserCount FROM  (SELECT COUNT(Master.dbo.sysprocesses.hostname) AS Users FROM   Master.dbo.sysprocesses LEFT OUTER JOIN Master.dbo.sysdatabases ON Master.dbo.sysdatabases.dbid = Master.dbo.sysprocesses.dbid WHERE (Master.dbo.sysdatabases.name = 'MyDatabase') GROUP BY Master.dbo.sysprocesses.net_address) AS UserCount_1

这基本上依赖于mac地址(Master.dbo.sysprocesses.net_address),因为工作站名称和ip地址都可以重复。

最近,这在许多客户中停止了工作。突然间,单个工作站显示同一工作站的多个网络地址,导致用户数量大大增加。这可能与SQL Server 2012有关-不确定。

我需要的是一种非常可靠的方式来获得登录到我的数据库的工作站数量。

如果有人能告诉我为什么我突然为每个工作站获得多个net_addresses,以及如何防止这种情况发生,那将是一个可能的解决方案。

否则,如果有人能给我一个坚如磐石的方法来获得工作站数量,而不是上面提到的,那就太好了。顺便说一下,我们最大的客户是50个用户。

下面是一个示例:

代码语言:javascript
复制
SELECT Master.dbo.sysprocesses.hostname AS Users, Master.dbo.sysprocesses.net_address FROM Master.dbo.sysprocesses 
LEFT OUTER JOIN Master.dbo.sysdatabases ON Master.dbo.sysdatabases.dbid = Master.dbo.sysprocesses.dbid 
WHERE Master.dbo.sysdatabases.name = 'mydb' GROUP BY Master.dbo.sysprocesses.hostname, Master.dbo.sysprocesses.net_address

返回:

代码语言:javascript
复制
DAVID-PC  001CC490239E
FLOOR1    001CC41D8012
FLOOR2    CB8FEE6C5856
FLOOR3    A50B18FF1516
KER-PC7   6C626DEA68CC
LIZ-PC    A4E553460E35
LIZ-PC    EFE3F0E20260
LIZ-PC    FD32F7B30360
PAP       9D35A704C29C
PAP       CFB724BA1183
PAP       D1A58A8878E6
PAP       E9B116CA34B8
PAP       F38B335A7AE6

提前感谢您的帮助。

EN

回答 2

Stack Overflow用户

发布于 2015-03-11 07:59:10

您可以通过以下查询获得登录到SQL Server数据库的用户的准确计数:

代码语言:javascript
复制
SELECT                 
    DB_NAME(dbid) as DB
    COUNT(dbid) as Numb
    loginame as LoginNa
FROM                   
    sys.sysprocesses   
WHERE                  
    dbid > 0           
GROUP BY               
    dbid, loginame     

您还可以通过以下方式获取已连接用户的完整详细信息:

代码语言:javascript
复制
sp_who2 'Active'
票数 0
EN

Stack Overflow用户

发布于 2015-03-11 10:04:23

这是一种给出连接到给定数据库的is或MAC地址数量的方法。我会选择IP,因为在一个给定的高端工作站中可能会有多个NIC/MACs。

代码语言:javascript
复制
SELECT COUNT(DISTINCT c.client_net_address) as DistinctIPCount,
    COUNT(DISTINCT p.net_address) as DistinctMACCount
FROM sys.dm_exec_connections c INNER JOIN sys.dm_exec_sessions s ON c.session_id = s.session_id
    INNER JOIN sysprocesses p ON s.session_id = p.spid
WHERE s.is_user_process = 1
    AND p.dbid = DB_ID('yourdbnamehere')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28976123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档