如何防止扩展事件跟踪系统触发的事件?

Rit*_*kre 3 sql-server extended-events

我使用了扩展事件来跟踪在特定数据库中的表上执行的 DML 和 DDL 操作。除此之外,我还跟踪用户(现在我是唯一用户)在被跟踪的数据库中执行的过程。我正在使用事件“sql_statement_completed”。它捕获所有成功完成的 sql 语句,然后我过滤语句以仅存储 Insert、Update、Delete 和 Drop 语句(也存储 exec 语句)。下面是与之相关的代码:

CREATE EVENT SESSION <track> ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.client_hostname,
           sqlserver.sql_text,
           sqlserver.username)
    WHERE ([sqlserver].[database_name]= <database_name> 
    AND [sqlserver].[is_system]=(0) 
    AND (([statement] like 'INSERT%' 
       OR [statement] like 'UPDATE%' 
       OR [statement] like 'DELETE%' 
       OR [statement] like 'DROP%' 
       OR [statement] like 'ALTER%' 
       OR [statement] like 'EXEC%')))) 
ADD TARGET package0.event_file(
    SET filename=N'C:\ExtendedEvents\track.xel',
    max_file_size=(102400),
    max_rollover_files=(10000),
    metadatafile=N'C:\ExtendedEvents\track.xem')
WITH (MAX_MEMORY=1048576 KB,
      EVENT_RETENTION_MODE=NO_EVENT_LOSS,
      MAX_DISPATCH_LATENCY=5 SECONDS,
      MAX_EVENT_SIZE=0 KB,
      MEMORY_PARTITION_MODE=NONE,
      TRACK_CAUSALITY=OFF,
      STARTUP_STATE=ON)
Run Code Online (Sandbox Code Playgroud)

现在,虽然这一直在跟踪正在针对数据库中的表执行的 DML 和 DDL 语句,但它也一直在跟踪一些没有被用户直接执行的语句(特别是一些似乎已被用户执行的过程语句)系统本身)。

下图包含了已跟踪的语句(不是直接解雇用户):

在此处输入图片说明

尽管这是事实,我已经明确地设置 [sqlserver].[is_system]=(0)where predicateExtended Eventsto disable tracking of system fired statements and only track the user fired statements

那么为什么它会跟踪系统触发的语句,如上图所示?如何规避相同?

Dan*_*man 6

这些语句看起来是由 SQL Server 工具、管理 API 或第三方产品生成的活动。此活动发生在常规连接上,而不是 is_system 字段标识的系统会话。

您可以添加过滤器client_app_name以排除不需要的活动,除非需要捕获来自该应用程序或工具的某些活动。