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