Как я могу получить точное количество компьютеров, вошедших в мою базу данных SQL Server?

Мы лицензируем наше программное обеспечение по количеству рабочих станций.

У меня есть запрос, который я использовал в течение многих лет, чтобы получить точное количество рабочих станций, вошедших в мою базу данных 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 - не уверен.

Что мне нужно, так это очень надежный способ получить количество рабочих станций, вошедших в мою базу данных.

Если кто-нибудь может сказать мне, почему я внезапно получаю несколько адресов net_addresses для каждой рабочей станции и как предотвратить это, это было бы одним из возможных решений.

В противном случае, если кто-нибудь может дать мне надежный способ получить количество рабочих станций, отличное от приведенного выше, это было бы здорово. Кстати, наш самый большой клиент - 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

Заранее благодарю за любую помощь.

2 ответа

Вот способ, который даст вам количество IP-адресов или MAC-адресов, подключенных к данной базе данных. Я бы пошел с IP, поскольку у вас может быть несколько сетевых карт /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')

Вы можете получить точное количество пользователей, вошедших в базу данных 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'
Другие вопросы по тегам