如何找到扩展事件的用户?
How Do I find the user for an extended event?
对于 MSSQL 服务器上的“简单”请求,我得到一个充满 Xml 的列:
SELECT CONVERT(XML, event_data) As event_data_xml
FROM sys.fn_xe_file_target_read_file('Test*.xel', NULL, NULL, NULL)
结果:
其中一个详细信息:
<event name="login" package="sqlserver" timestamp="2020-07-17T10:09:20.922Z">
<data name="is_cached">
<value>true</value>
</data>
<data name="is_recovered">
<value>false</value>
</data>
<data name="is_dac">
<value>false</value>
</data>
<data name="database_id">
<value>1</value>
</data>
<data name="packet_size">
<value>4096</value>
</data>
<data name="options">
<value>2000002838f4010000000000</value>
</data>
<data name="options_text">
<value />
</data>
<data name="database_name">
<value />
</data>
<action name="attach_activity_id" package="package0">
<value>093CAB81-B0B7-46CF-A807-F32D0469235A-2</value>
</action>
</event>
在这些细节中我没有得到任何提示,哪个用户调用了这个事件。所以:
如何通过 SQL 代码找出用户调用此事件?
感谢帮助!
设置扩展事件时,您应该展开事件(通过单击它)并在全局字段选项卡中检查 nt_username
and/or username
和任何其他字段这可能很有趣。 (即:client_hostname、client_app_name)
您应该根据您的屏幕截图、登录和注销对您案例中的所有选定事件执行此操作。
在 T-SQL:
-- Drop the existing Login event
ALTER EVENT SESSION [Test_Event] ON SERVER
DROP EVENT sqlserver.login
-- Drop the existing logout event
ALTER EVENT SESSION [Test_Event] ON SERVER
DROP EVENT sqlserver.logout
-- Add a new login event with properties : nt_username and username
ALTER EVENT SESSION [Test_Event] ON SERVER
ADD EVENT sqlserver.login(
ACTION(sqlserver.nt_username,sqlserver.username))
-- Add a new logout event with properties : nt_username and username
ALTER EVENT SESSION [Test_Event] ON SERVER
ADD EVENT sqlserver.logout(
ACTION(sqlserver.nt_username,sqlserver.username))
新事件将包含所选字段:
<event name="login" package="sqlserver" timestamp="2020-07-27T05:59:26.931Z">
<data name="is_cached">
<value>true</value>
</data>
<data name="is_recovered">
<value>false</value>
</data>
<data name="is_dac">
<value>false</value>
</data>
<data name="database_id">
<value>1</value>
</data>
<data name="packet_size">
<value>8000</value>
</data>
<data name="options">
<value>2000002838f4010000000000</value>
</data>
<data name="options_text">
<value />
</data>
<data name="database_name">
<value />
</data>
<!--Newly selected global fields-->
<action name="username" package="sqlserver">
<value>Domain\Username</value>
</action>
<action name="nt_username" package="sqlserver">
<value>Domain\Username</value>
</action>
</event>
对于 MSSQL 服务器上的“简单”请求,我得到一个充满 Xml 的列:
SELECT CONVERT(XML, event_data) As event_data_xml
FROM sys.fn_xe_file_target_read_file('Test*.xel', NULL, NULL, NULL)
结果:
其中一个详细信息:
<event name="login" package="sqlserver" timestamp="2020-07-17T10:09:20.922Z">
<data name="is_cached">
<value>true</value>
</data>
<data name="is_recovered">
<value>false</value>
</data>
<data name="is_dac">
<value>false</value>
</data>
<data name="database_id">
<value>1</value>
</data>
<data name="packet_size">
<value>4096</value>
</data>
<data name="options">
<value>2000002838f4010000000000</value>
</data>
<data name="options_text">
<value />
</data>
<data name="database_name">
<value />
</data>
<action name="attach_activity_id" package="package0">
<value>093CAB81-B0B7-46CF-A807-F32D0469235A-2</value>
</action>
</event>
在这些细节中我没有得到任何提示,哪个用户调用了这个事件。所以:
如何通过 SQL 代码找出用户调用此事件?
感谢帮助!
设置扩展事件时,您应该展开事件(通过单击它)并在全局字段选项卡中检查 nt_username
and/or username
和任何其他字段这可能很有趣。 (即:client_hostname、client_app_name)
您应该根据您的屏幕截图、登录和注销对您案例中的所有选定事件执行此操作。
在 T-SQL:
-- Drop the existing Login event
ALTER EVENT SESSION [Test_Event] ON SERVER
DROP EVENT sqlserver.login
-- Drop the existing logout event
ALTER EVENT SESSION [Test_Event] ON SERVER
DROP EVENT sqlserver.logout
-- Add a new login event with properties : nt_username and username
ALTER EVENT SESSION [Test_Event] ON SERVER
ADD EVENT sqlserver.login(
ACTION(sqlserver.nt_username,sqlserver.username))
-- Add a new logout event with properties : nt_username and username
ALTER EVENT SESSION [Test_Event] ON SERVER
ADD EVENT sqlserver.logout(
ACTION(sqlserver.nt_username,sqlserver.username))
新事件将包含所选字段:
<event name="login" package="sqlserver" timestamp="2020-07-27T05:59:26.931Z">
<data name="is_cached">
<value>true</value>
</data>
<data name="is_recovered">
<value>false</value>
</data>
<data name="is_dac">
<value>false</value>
</data>
<data name="database_id">
<value>1</value>
</data>
<data name="packet_size">
<value>8000</value>
</data>
<data name="options">
<value>2000002838f4010000000000</value>
</data>
<data name="options_text">
<value />
</data>
<data name="database_name">
<value />
</data>
<!--Newly selected global fields-->
<action name="username" package="sqlserver">
<value>Domain\Username</value>
</action>
<action name="nt_username" package="sqlserver">
<value>Domain\Username</value>
</action>
</event>