SQL 服务器扩展事件:使用 SP 调用跟踪异常
SQL Server extended events: track exception with SP call
我需要跟踪失败的远程过程调用(RPC started/completed 事件)。
- 具有所有 in/out 参数的精确过程调用语句
- 过程抛出异常
我试过的:
很容易跟踪准确的 RPC started/completed 事件
使用 error_reported 事件很容易跟踪错误
但是,我找不到在一个地方跟踪两者的方法。
P.S。我不能使用输出参数来[=44=]错误并使用RPC完成事件跟踪它。
如果您在事件会话中添加 TRACK_CAUSALITY 选项,它会添加一个操作,允许您将同一事件产生的事件关联起来。这是我刚刚制作的示例活动会话:
CREATE EVENT SESSION [sp errors] ON SERVER
ADD EVENT sqlserver.error_reported,
ADD EVENT sqlserver.module_end(SET collect_statement=(1)),
ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1))
ADD TARGET package0.ring_buffer
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
然后我创建了一个存在被零除错误的存储过程并调用了它。这是我在环形缓冲区中得到的(截断为相关事件):
<event name="error_reported" package="sqlserver" timestamp="2018-01-26T15:44:58.652Z">
<data name="error_number">
<type name="int32" package="package0"></type>
<value>8134</value>
</data>
<data name="severity">
<type name="int32" package="package0"></type>
<value>16</value>
</data>
<data name="state">
<type name="int32" package="package0"></type>
<value>1</value>
</data>
<data name="user_defined">
<type name="boolean" package="package0"></type>
<value>false</value>
</data>
<data name="category">
<type name="error_category" package="sqlserver"></type>
<value>2</value>
<text><![CDATA[SERVER]]></text>
</data>
<data name="destination">
<type name="error_destination" package="sqlserver"></type>
<value>0x00000002</value>
<text><![CDATA[USER]]></text>
</data>
<data name="is_intercepted">
<type name="boolean" package="package0"></type>
<value>false</value>
</data>
<data name="message">
<type name="unicode_string" package="package0"></type>
<value><![CDATA[Divide by zero error encountered.]]></value>
</data>
<action name="attach_activity_id_xfer" package="package0">
<type name="activity_id_xfer" package="package0"></type>
<value>110CE72A-3B30-4086-BD7E-9E2E3734C803-0</value>
</action>
<action name="attach_activity_id" package="package0">
<type name="activity_id" package="package0"></type>
<value>A3050AC2-36EF-493F-9E37-BF7884EF55DC-1</value>
</action>
</event>
<event name="module_end" package="sqlserver" timestamp="2018-01-26T15:44:58.657Z">
<data name="source_database_id">
<type name="uint32" package="package0"></type>
<value>2</value>
</data>
<data name="object_id">
<type name="int32" package="package0"></type>
<value>-1530582118</value>
</data>
<data name="duration">
<type name="uint64" package="package0"></type>
<value>6025</value>
</data>
<data name="row_count">
<type name="uint64" package="package0"></type>
<value>0</value>
</data>
<data name="line_number">
<type name="int32" package="package0"></type>
<value>1</value>
</data>
<data name="offset">
<type name="int32" package="package0"></type>
<value>0</value>
</data>
<data name="offset_end">
<type name="int32" package="package0"></type>
<value>-1</value>
</data>
<data name="object_type">
<type name="ansi_string" package="package0"></type>
<value><![CDATA[P ]]></value>
</data>
<data name="object_name">
<type name="unicode_string" package="package0"></type>
<value><![CDATA[#foo____________________________________________________________________________________________________________________00005935]]></value>
</data>
<data name="statement">
<type name="xml" package="package0"></type>
<value>exec #foo</value>
</data>
<action name="attach_activity_id" package="package0">
<type name="activity_id" package="package0"></type>
<value>A3050AC2-36EF-493F-9E37-BF7884EF55DC-2</value>
</action>
</event>
每个事件都有一个 attach_activity_id
节点,其值基本相同。但是,如果将其转换为唯一标识符,该值是相同的!
祝你好运。您将需要它来进行 XML 将来的粉碎。 :)
我需要跟踪失败的远程过程调用(RPC started/completed 事件)。
- 具有所有 in/out 参数的精确过程调用语句
- 过程抛出异常
我试过的:
很容易跟踪准确的 RPC started/completed 事件
使用 error_reported 事件很容易跟踪错误
但是,我找不到在一个地方跟踪两者的方法。
P.S。我不能使用输出参数来[=44=]错误并使用RPC完成事件跟踪它。
如果您在事件会话中添加 TRACK_CAUSALITY 选项,它会添加一个操作,允许您将同一事件产生的事件关联起来。这是我刚刚制作的示例活动会话:
CREATE EVENT SESSION [sp errors] ON SERVER
ADD EVENT sqlserver.error_reported,
ADD EVENT sqlserver.module_end(SET collect_statement=(1)),
ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1))
ADD TARGET package0.ring_buffer
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
然后我创建了一个存在被零除错误的存储过程并调用了它。这是我在环形缓冲区中得到的(截断为相关事件):
<event name="error_reported" package="sqlserver" timestamp="2018-01-26T15:44:58.652Z">
<data name="error_number">
<type name="int32" package="package0"></type>
<value>8134</value>
</data>
<data name="severity">
<type name="int32" package="package0"></type>
<value>16</value>
</data>
<data name="state">
<type name="int32" package="package0"></type>
<value>1</value>
</data>
<data name="user_defined">
<type name="boolean" package="package0"></type>
<value>false</value>
</data>
<data name="category">
<type name="error_category" package="sqlserver"></type>
<value>2</value>
<text><![CDATA[SERVER]]></text>
</data>
<data name="destination">
<type name="error_destination" package="sqlserver"></type>
<value>0x00000002</value>
<text><![CDATA[USER]]></text>
</data>
<data name="is_intercepted">
<type name="boolean" package="package0"></type>
<value>false</value>
</data>
<data name="message">
<type name="unicode_string" package="package0"></type>
<value><![CDATA[Divide by zero error encountered.]]></value>
</data>
<action name="attach_activity_id_xfer" package="package0">
<type name="activity_id_xfer" package="package0"></type>
<value>110CE72A-3B30-4086-BD7E-9E2E3734C803-0</value>
</action>
<action name="attach_activity_id" package="package0">
<type name="activity_id" package="package0"></type>
<value>A3050AC2-36EF-493F-9E37-BF7884EF55DC-1</value>
</action>
</event>
<event name="module_end" package="sqlserver" timestamp="2018-01-26T15:44:58.657Z">
<data name="source_database_id">
<type name="uint32" package="package0"></type>
<value>2</value>
</data>
<data name="object_id">
<type name="int32" package="package0"></type>
<value>-1530582118</value>
</data>
<data name="duration">
<type name="uint64" package="package0"></type>
<value>6025</value>
</data>
<data name="row_count">
<type name="uint64" package="package0"></type>
<value>0</value>
</data>
<data name="line_number">
<type name="int32" package="package0"></type>
<value>1</value>
</data>
<data name="offset">
<type name="int32" package="package0"></type>
<value>0</value>
</data>
<data name="offset_end">
<type name="int32" package="package0"></type>
<value>-1</value>
</data>
<data name="object_type">
<type name="ansi_string" package="package0"></type>
<value><![CDATA[P ]]></value>
</data>
<data name="object_name">
<type name="unicode_string" package="package0"></type>
<value><![CDATA[#foo____________________________________________________________________________________________________________________00005935]]></value>
</data>
<data name="statement">
<type name="xml" package="package0"></type>
<value>exec #foo</value>
</data>
<action name="attach_activity_id" package="package0">
<type name="activity_id" package="package0"></type>
<value>A3050AC2-36EF-493F-9E37-BF7884EF55DC-2</value>
</action>
</event>
每个事件都有一个 attach_activity_id
节点,其值基本相同。但是,如果将其转换为唯一标识符,该值是相同的!
祝你好运。您将需要它来进行 XML 将来的粉碎。 :)