Sql-Server
使用擴展事件跟踪單個儲存過程
我正在嘗試跟踪儲存過程的所有執行(包括來自其他儲存過程的內部)和該過程的語句 - 這可能與擴展事件有關嗎?我目前的擴展活動是:
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
您可以看到該
sql_text
列是輸入緩衝區 - 擷取外部範圍。
statement
列有確切的行。我寫了更多關於解析
tsql_stack
這裡的部落格。 使用擴展事件調查錯誤