1

ソフトウェアのライセンスは、ワークステーションの数に基づいています。

SQL Server データベースにログインしているワークステーションの正確な数を取得するために何年も使用してきたクエリがあります。簡単にするために、すべてのユーザーが同じログイン名/パスワードを使用します。これは、DB にアタッチするスクリプトに組み込まれています。彼らは、例外を除いて、その DB にのみアクセスできます。

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

ワークステーション名と IP アドレスの両方が重複する可能性があるため、基本的にこれは MAC アドレス (Master.dbo.sysprocesses.net_address) に依存します。

最近、これは多くの顧客で機能しなくなりました。突然、個々のワークステーションが同じワークステーションの複数のネット アドレスを表示するようになり、ユーザー数が大幅に増加します。これは SQL Server 2012 に関連している可能性があります - よくわかりません。

私が必要としているのは、データベースにログインしているワークステーションの数を取得するための非常に信頼できる方法です。

ワークステーションごとに突然複数の net_addresses を取得する理由と、それを防ぐ方法を誰かが教えてくれれば、それが可能な解決策の 1 つになります。

それ以外の場合は、上記以外のワークステーション数を取得するための堅実な方法を誰かが教えてくれれば、それは素晴らしいことです. ちなみに、私たちの最大の顧客は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 アドレスの数を取得する方法を次に示します。特定のハイエンド ワークステーションに複数の NIC/MAC がある可能性があるため、IP を使用します。

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 に答える