使用扩展事件跟踪单个存储过程

Oli*_*age 8 sql-server extended-events

我正在尝试跟踪存储过程的所有执行(包括来自其他存储过程内部)以及该过程的语句 - 这对于扩展事件是否可能?我当前的扩展活动是:

CREATE EVENT SESSION [EVENT_NAME] ON SERVER
ADD EVENT sqlserver.rpc_completed(SET collect_data_stream=(1)
ACTION(sqlserver.database_id,sqlserver.database_name,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%MY_STORED_PROCEDURE_NAME%'))),
ADD EVENT sqlserver.sp_statement_completed(
ACTION(sqlserver.database_id,sqlserver.database_name,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%MY_STORED_PROCEDURE_NAME%'))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.database_id,sqlserver.database_name,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%MY_STORED_PROCEDURE_NAME%')))
ADD TARGET package0.event_file(SET filename=N'TraceData')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用,除非我手动执行该过程。有什么最佳实践方法可以做到这一点?

Zik*_*ato 12

你的方法非常昂贵。
您可以使用module_start事件来有效地跟踪这一点。

准备一个演示

CREATE OR ALTER PROCEDURE dbo.TrackedProcedure
    @param int 
AS
BEGIN
    SELECT @param
END 

GO

CREATE OR ALTER PROCEDURE dbo.WrapperProcedure
    @passParam int 
AS
BEGIN
    /* do something */

    SELECT 'WrapperProcedure' AS context

    EXEC dbo.TrackedProcedure 
        @param = @passParam
END
GO
Run Code Online (Sandbox Code Playgroud)

还有 XE 会话的草稿 - 您应该添加一些数据持久选项。

CREATE EVENT SESSION [TrackProcedure] ON SERVER 
ADD EVENT sqlserver.module_start
(
    SET collect_statement=1
    ACTION
    (
        sqlserver.client_app_name,                 /* Additional audit info */
        sqlserver.database_name,                   /* Additional audit info */
        sqlserver.session_server_principal_name,   /* Additional audit info */
        sqlserver.username,                        /* Additional audit info */
        sqlserver.sql_text,
        sqlserver.tsql_stack
    )
    WHERE 
    (
        [object_type]='P ' /* The space behind P is necesssary */
        AND [object_name]=N'TrackedProcedure'
    )
)
Run Code Online (Sandbox Code Playgroud)

然后我执行这样的代码:

/* Batch 1 */
EXEC dbo.TrackedProcedure 
    @param = 10
GO

/* Batch 2 */
EXEC dbo.WrapperProcedure
    @passParam = 5 -- int
GO
Run Code Online (Sandbox Code Playgroud)

XE 显示捕获的数据

您可以看到该sql_text列是输入缓冲区 - 捕获外部范围。
statement列有精确的行。

我在博客中详细介绍了解析tsql_stack这里的内容。 调查扩展事件的错误