patternsqlMinor
Find the identity of the client firing a query in SQL Server without using triggers?
Viewed 0 times
identitythewithoutsqlqueryfiringclientusingfindserver
Problem
I'm currently using Change Data Capture (CDC) to track data changes, and I wish to track the host name and IP address of the client submitting the query that made the changes. If there are 5 different clients logged in via the same user name, one faces the conundrum of tracking which of the 5 fired the query. Other specious solutions that I found include altering the CDC table with following command:
However, this returns the host-name of the server on which the query was fired, and not the host-name of the client that fires the query.
Is there a way around this problem? Something that would help to log the host-name or the IP address (or some other kind of unique identity) of the client.
I do not want to use triggers, as it slows down the system, also CDC generates system tables, so having a trigger on that is apparently not possible.
ALTER TABLE cdc.schema_table_CT
ADD HostName nvarchar(50) NULL DEFAULT(HOST_NAME())However, this returns the host-name of the server on which the query was fired, and not the host-name of the client that fires the query.
Is there a way around this problem? Something that would help to log the host-name or the IP address (or some other kind of unique identity) of the client.
I do not want to use triggers, as it slows down the system, also CDC generates system tables, so having a trigger on that is apparently not possible.
Solution
I am not sure about CDC, but if the login has
This is given in Books Online here. I changed the query to add columns which would give you the
view server state permission you can use DMVs to get some information. This is given in Books Online here. I changed the query to add columns which would give you the
IP address:SELECT
c.session_id, c.net_transport, c.encrypt_option, c.auth_scheme,
s.host_name, s.program_name, s.client_interface_name,
c.local_net_address, c.client_net_address, s.login_name, s.nt_domain,
s.nt_user_name, s.original_login_name, c.connect_time, s.login_time
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
ON c.session_id = s.session_id
WHERE c.session_id = SPID; --session ID you want to trackCode Snippets
SELECT
c.session_id, c.net_transport, c.encrypt_option, c.auth_scheme,
s.host_name, s.program_name, s.client_interface_name,
c.local_net_address, c.client_net_address, s.login_name, s.nt_domain,
s.nt_user_name, s.original_login_name, c.connect_time, s.login_time
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
ON c.session_id = s.session_id
WHERE c.session_id = SPID; --session ID you want to trackContext
StackExchange Database Administrators Q#111517, answer score: 5
Revisions (0)
No revisions yet.