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)
您可以看到该sql_text
列是输入缓冲区 - 捕获外部范围。
statement
列有精确的行。
我在博客中详细介绍了解析tsql_stack
这里的内容。
调查扩展事件的错误
归档时间: |
|
查看次数: |
4550 次 |
最近记录: |