สมมติว่าฉันพบ SQL Server และฉันไม่รู้ว่าแอปพลิเคชันใดที่เชื่อมต่อกับมัน บางทีฉันอาจพบแอปพลิเคชั่นเดียว แต่ฉันไม่แน่ใจว่าเป็นแอปพลิเคชั่นเดียวที่ใช้หรือไม่
มีวิธีที่ดีในการค้นหาการเชื่อมต่อที่แตกต่างกันทั้งหมดหรือไม่?
สมมติว่าฉันพบ SQL Server และฉันไม่รู้ว่าแอปพลิเคชันใดที่เชื่อมต่อกับมัน บางทีฉันอาจพบแอปพลิเคชั่นเดียว แต่ฉันไม่แน่ใจว่าเป็นแอปพลิเคชั่นเดียวที่ใช้หรือไม่
มีวิธีที่ดีในการค้นหาการเชื่อมต่อที่แตกต่างกันทั้งหมดหรือไม่?
คำตอบ:
คุณสามารถดูกระบวนการที่กำลังทำงานอยู่ใน 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
IP และข้อมูลอื่น ๆ ที่สามารถเรียกดูได้ด้วยการเข้าร่วมsys.dm_exec_connectionsในsession_id
: client_net_address
, local_net_address
, connect_time
พอร์ต ...
sys.dm_exec_requestsยังสามารถให้ข้อมูลที่เป็นประโยชน์: command
ประเภทsql_handle
,, ...
แบบสอบถามนี้เป็นเพียงตัวอย่าง คุณต้องดูJOIN
ทั้งสามนี้ด้วยกันและส่งออก / เก็บข้อมูลที่เกี่ยวข้องจากหนึ่งในนั้น
ข้อมูลจากมุมมองเหล่านี้หายไปเมื่อรีสตาร์ท SQL Server ดังนั้นหากแอปพลิเคชันไม่ได้เชื่อมต่อเป็นประจำอาจเป็นความคิดที่ดีที่จะเก็บแอปพลิเคชันเหล่านี้เป็นประจำโดยใช้งานหรือสคริปต์ (Powershell)
ฉันจะแนะนำสิ่งที่ Julien แนะนำ แต่ฉันเดาว่าการตั้งเวลาการสืบค้นผ่าน SQL Server Agent น่าจะเป็นแนวคิดที่ดีกว่าและทุกครั้งที่คุณเรียกใช้การถ่ายโอนข้อมูลลงในตารางทางกายภาพ สอง 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 ทุก 15 session_information
นาทีหรือมากกว่านั้นและในตอนท้ายของวันที่คุณสามารถมองเห็นทุกสิ่งที่คุณชอบจากตาราง
เปิดใช้งานการตรวจสอบการเข้าสู่ระบบ SQL Server สำหรับการเข้าสู่ระบบที่สำเร็จและล้มเหลว: https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio
การเปลี่ยนขอบเขตการตรวจสอบจะต้องเริ่มบริการ SQL ใหม่ เมื่อบริการเริ่มต้นใหม่การเข้าสู่ระบบที่สำเร็จทั้งหมด (ผู้ใช้) และที่อยู่ IP ของมันจะเริ่มได้รับการบันทึกไว้ในบันทึกของ SQL Server ข้อมูลนี้สามารถรวบรวมได้ประมาณหนึ่งสัปดาห์หรือ 2 และจากนั้นจะวิเคราะห์ไฟล์บันทึกเพื่อแสดงรายการที่อยู่ IP (และผู้ใช้) ทั้งหมดที่มีการเข้าถึงฐานข้อมูล SQL Server ในช่วงระยะเวลาที่ตรวจสอบ
หากมีการติดตั้งคอมโพเนนต์ SSRS ไว้ในกล่องเดียวกันตาราง ExecutionLog ของฐานข้อมูล ReportServer สามารถวิเคราะห์เพื่อแสดงรายการการเข้าสู่ระบบทั้งหมดที่เข้าถึงพอร์ทัล SSRS
จากรับที่อยู่ IP ของลูกค้าใน SQL ServerโดยSarvesh Kumar Gupta :
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