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


10

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

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

Answers:


14

您可以在活动监视器中查看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;

主机名,进程名或域用户名通常提供的信息不仅仅是IP地址。可以添加其他列,例如:login_timelast_successful_logon

IP等信息可以检索与JOIN来sys.dm_exec_connectionssession_idclient_net_addresslocal_net_addressconnect_time,港口,...

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

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

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


3

我也将建议Julien的建议,但是我想通过SQL Server Agent安排查询是一个更好的主意,然后在每次运行时,您都将信息转储到物理表中。加入了两个DMV sys.dm_exec_connectionssys.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
);

然后将记录插入此表中:

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;

安排它每隔15分钟左右通过SQL Server代理运行一次,最终您可以从表中看到所需的所有内容session_information


2

为成功和失败的登录启用SQL Server登录审核:https : //docs.microsoft.com/zh-cn/sql/ssms/configure-login-auditing-sql-server-management-studio

更改审核范围将需要重新启动SQL服务。服务重新启动后,所有成功的登录名(用户)及其IP地址将开始在SQL Server日志中记录。可以收集大约一周或两周的数据,然后对日志文件进行分析,以列出在监视期间访问SQL Server数据库的所有IP地址(和用户)。

如果在同一框中还安装了SSRS组件,则可以分析ReportServer数据库的ExecutionLog表以列出访问SSRS门户的所有登录。


-2

SQL Server中获取客户端IP地址Sarvesh库马尔古普塔

CREATE FUNCTION [dbo].[GetCurrentIP] ()
RETURNS varchar(255)
AS
BEGIN
    DECLARE @IP_Address varchar(255);

   SELECT @IP_Address = client_net_address
    FROM sys.dm_exec_connections
    WHERE Session_id = @@SPID;

   Return @IP_Address;
END

这将返回运行它的连接的client_net_address。在某些情况下这可能很有用,但此处并不需要,特别是因为未知的应用程序不会调用此函数。
Julien Vavasseur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.