1

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

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

USE [Master] GRANT VIEW SERVER STATE to MyUser

一直在工作的查询如下:

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 有关 - 不确定。

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

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

否则,如果有人可以给我一个坚如磐石的方法来获得除上述以外的工作站数量,那就太好了。顺便说一句,我们最大的客户是 50 个用户。

这是一个例子:

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

回报:

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

提前感谢您的帮助。

4

2 回答 2

0

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

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')
于 2015-03-11T02:04:22.860 回答
0

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

SELECT                 
    DB_NAME(dbid) as DB
    COUNT(dbid) as Numb
    loginame as LoginNa
FROM                   
    sys.sysprocesses   
WHERE                  
    dbid > 0           
GROUP BY               
    dbid, loginame     

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

sp_who2 'Active'
于 2015-03-10T23:59:10.250 回答