Sql-Server

使用擴展事件跟踪單個儲存過程

  • April 14, 2022

我正在嘗試跟踪儲存過程的所有執行(包括來自其他儲存過程的內部)和該過程的語句 - 這可能與擴展事件有關嗎?我目前的擴展活動是:

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

但這似乎不起作用,除非我手動執行該過程。有什麼最佳實踐方法可以做到這一點?

你的方法很昂貴。

您可以使用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

以及 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'
   )
)

然後我執行這樣的程式碼:

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

/* Batch 2 */
EXEC dbo.WrapperProcedure
   @passParam = 5 -- int
GO

XE 顯示擷取的數據

您可以看到該sql_text列是輸入緩衝區 - 擷取外部範圍。

statement列有確切的行。

我寫了更多關於解析tsql_stack這裡的部落格。 使用擴展事件調查錯誤

引用自:https://dba.stackexchange.com/questions/310937