Cra*_*ein 5 trigger profiler sql-server-2008-r2
在最近对默认跟踪输出的分析中注意到 100 个 sort_warning 错误后,我正在尝试获取导致这些警告的查询文本。
SQL Server Profiler 有一个名为 Sort Warnings 的事件,但它没有 TextData 列。
2008 R2 无法使用扩展事件,因为 sort_warning 事件在 2008 R2 的扩展事件中不可用。
我想在我用来存储分析器结果的表上放置一个触发器,以捕获来自 DBCC INPUTBUFFER 的输出。
-- table to store the results of dbcc inputbuffer
CREATE TABLE Trace_Results(EventType NVARCHAR(30), Parameters INT, EventInfo NVARCHAR(255))
CREATE TRIGGER [dbo].[Trace_Trigger]
ON [dbo].Trace_Table
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL VARCHAR(MAX)
SELECT @SQL = 'DBCC INPUTBUFFER(' + CONVERT(VARCHAR(10), ins.SPID) + ')'
FROM inserted ins
--PRINT @SQL
INSERT INTO Trace_Results (EventType, Parameters, EventInfo)
EXEC(@SQL)
END
Run Code Online (Sandbox Code Playgroud)
我可以从分析器开始跟踪而没有任何错误,但是当我运行导致排序警告的查询时,我收到以下错误:
这会导致跟踪停止。
我也只是尝试使用以下命令直接插入到 Trace_Table 表中
INSERT INTO trace_table (eventclass) values(1)
Run Code Online (Sandbox Code Playgroud)
,但 Trace_Results 表中没有显示任何内容。
如果我在数据库中的任何其他用户表上放置相同的触发器,则 DBCC INPUTBUFFER 的结果将按预期存储在 Trace_Results 中。
什么会阻止在 SQL Server Profiler 中创建的表上的触发器将数据插入另一个表?
更新 24/01
尝试@Kin 的解决方案,但仍然在 SQLText 列中获得 NULL
用于导致排序警告的查询
-- Declare table variable
DECLARE @T1 TABLE (Col1 int, Col2 varchar(8000))
-- Insert data to table variable
INSERT INTO @T1
SELECT * FROM dbo.TestTable
-- Return data sorted on Col2 column
SELECT * FROM @T1
ORDER BY Col2 ASC
Run Code Online (Sandbox Code Playgroud)
sort_warnings_log 表的屏幕截图
这些是记录的消息:
16943 无法完成游标操作,因为声明游标后表架构发生了更改。
19052 修改之前必须停止活动跟踪。
因此,这似乎是在跟踪表上创建触发器的固有问题(并且我没有打开调试器来准确查看 Profiler 在这种情况下尝试执行的操作)。这与您在触发器中提取 spid 值、使用 DBCC INPUTBUFFER 或使用动态 SQL 无关。一个简单的触发器也会PRINT N'hi';
导致相同的症状:这两个异常、Profiler 中的错误对话框以及跟踪完全停止记录到该表。
也许您可以设置一个跟踪来收集排序警告事件和 SQL:StmtCompleted,并尝试使用序列/事务信息或简单的直觉手动将它们关联起来。或者你可以试试我上面的想法:
一旦服务器端跟踪启动并运行,您始终可以自动将跟踪数据从文件拉入表中 - 我怀疑在不涉及 Profiler 时,这样的表将能够利用这样的触发器。
它并不像听起来那么简单,并且必须非常频繁地轮询才能使触发器依赖于后续输入缓冲区数据的及时性。我不想太深入地了解其实现细节,这只是一个即兴的想法。
另一个想法是升级。:-)