查找访问特定 SQL Server 的所有 IP 或用户

Ray*_*and 11 sql-server sql-server-2012 troubleshooting connections

假设我找到了一个 SQL Server,但我不知道哪些应用程序连接到它。也许我找到了一个应用程序,但我不确定它是否是唯一一个使用它的应用程序。

有没有找到所有不同连接的好方法?

Jul*_*eur 15

您可以在 Activity Monitor 的 SSMS 中查看当前正在运行的进程。

您还可以使用sys.dm_exec_sessions以及sys.dm_exec_connectionssys.dm_exec_requests获取它。

询问:

SELECT DB_NAME(database_id) as [DB]
    , login_name
    , nt_domain
    , nt_user_name
    , status
    , host_name
    , program_name
    , COUNT(*) AS [Connections]
FROM sys.dm_exec_sessions
WHERE database_id > 0 -- OR 4 for user DBs
GROUP BY database_id, login_name, status, host_name, program_name, nt_domain, nt_user_name;
Run Code Online (Sandbox Code Playgroud)

主机名、进程名或域用户名通常提供比 IP 地址更多的信息。其他列可以添加,如:login_timelast_successful_logon

IP 和其他信息可以通过 JOIN 检索到sys.dm_exec_connections on session_id: client_net_address, local_net_address, connect_time, ports, ...

sys.dm_exec_requests也可以提供有用的信息:commandtype, sql_handle, ...

此查询只是一个示例。您必须JOIN将这 3 个视图放在一起,并从其中一个输出/存储相关信息。

重新启动 SQL Server 时,这些视图中的数据将消失。因此,如果应用程序没有定期连接,使用作业或脚本(Powershell)定期存储它们可能是个好主意。


Sha*_*nky 5

我也会建议 Julien 建议的内容,但我想通过 SQL Server 代理安排查询会是更好的主意,然后每次运行时都将信息转储到物理表中。两个 DMV 已加入sys.dm_exec_connections并且sys.dm_exec_sessions

就像首先创建一个物理表

create table Session_Information 
( session_id int,
net_transport nvarchar(40),
host_name nvarchar(128),
program_name nvarchar(128),
nt_user_name nvarchar(128), 
connect_time datetime,
client_interface_name  nvarchar(128),
client_net_address varchar(48),
local_net_address varchar(48),
login_name nvarchar(128),
nt_domain nvarchar(128),
login_time datetime
);
Run Code Online (Sandbox Code Playgroud)

然后将记录插入到该表中:

Insert into Session_Information
  SELECT 
      c.session_id, 
      c.net_transport, 
      s.host_name, 
      s.program_name, 
      s.nt_user_name,
      c.connect_time, 
      s.client_interface_name,
      c.client_net_address,
      c.local_net_address, 
      s.login_name, 
      s.nt_domain, 
      s.login_time 
  FROM sys.dm_exec_connections AS c
  JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id;
Run Code Online (Sandbox Code Playgroud)

通过 SQL Server 代理安排此操作每 15 分钟左右运行一次,在一天结束时,您可以从表中看到您喜欢的所有内容session_information