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


10

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

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

답변:


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_time,last_successful_logon

A는에 가입하여 IP 및 기타 정보를 검색 할 수 있습니다 sys.dm_exec_connectionssession_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.