특정 SQL Server에 액세스하는 모든 IP 또는 사용자 찾기


10

SQL Server를 찾았는데 어떤 응용 프로그램이 SQL Server에 연결되어 있는지 모릅니다. 어쩌면 하나의 응용 프로그램을 찾을 수 있지만 응용 프로그램을 사용하는 유일한 응용 프로그램인지 확실하지 않습니다.

모든 별개의 연결을 찾는 좋은 방법이 있습니까?

답변:


14

활동 모니터의 SSMS에서 현재 실행중인 프로세스를 볼 수 있습니다.

sys.dm_exec_sessions 뿐만 아니라 sys.dm_exec_connections 및 sys.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_time,last_successful_logon

A는에 가입하여 IP 및 기타 정보를 검색 할 수 있습니다 sys.dm_exec_connections 에 session_id: client_net_address, local_net_address, connect_time, 포트, ...

sys.dm_exec_requests 도 유용한 정보를 제공 할 수 있습니다 : commandtype sql_handle,, ...

이 쿼리는 샘플 일뿐입니다. 당신이해야 JOIN이 3 개보기 함께 그들 중 하나에서 출력 / 저장 정보가 존재하지 않습니다.

SQL Server를 다시 시작하면 이러한보기의 데이터가 사라집니다. 따라서 응용 프로그램이 정기적으로 연결되어 있지 않으면 작업이나 스크립트 (Powershell)를 사용하여 정기적으로 저장하는 것이 좋습니다.


3

또한 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
);

그런 다음이 테이블에 레코드를 삽입하십시오.

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;

SQL Server 에이전트를 통해 15 분마다 실행되도록 예약하고 하루가 끝나면 테이블에서 원하는 모든 것을 볼 수 있습니다 session_information.


2

성공 및 실패한 로그인에 대해 SQL Server 로그인 감사를 활성화하십시오. https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio

감사 범위를 변경하려면 SQL 서비스를 다시 시작해야합니다. 서비스가 다시 시작되면 모든 성공적인 로그인 (사용자) 및 해당 IP 주소가 SQL Server 로그에 기록되기 시작합니다. 이 데이터는 약 일주일 또는 2 주 동안 수집 된 다음 모니터링되는 기간 동안 SQL Server 데이터베이스에 액세스 한 모든 IP 주소 (및 사용자)를 나열하기 위해 로그 파일을 분석합니다.

SSRS 구성 요소가 같은 상자에 설치되어 있으면 ReportServer 데이터베이스의 ExecutionLog 테이블을 분석하여 SSRS 포털에 액세스하는 모든 로그인을 나열 할 수 있습니다.


-2

에서 SQL 서버에서 가져 오기 클라이언트 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.