1

对于 MSSQL Server 上的“简单”请求,我得到一个充满 Xmls 的列:

SELECT CONVERT(XML, event_data) As event_data_xml 
    FROM sys.fn_xe_file_target_read_file('Test*.xel', NULL, NULL, NULL)

结果:

Sql 结果

其中之一的详细信息:

<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 代码找出是哪个用户调用了这个事件,怎么办?

感谢帮助!

4

1 回答 1

1

设置扩展事件时,您应该扩展事件(通过单击它)并在全局字段选项卡中检查nt_username和/或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>
于 2020-07-27T05:56:31.577 回答