我正在尝试在 SQL Server 2008 R2 中设置服务器端跟踪。虽然我选择事件和数据列没有问题,但过滤似乎有点奇怪......
我试图在 SQL 批处理或存储过程的持续时间上设置过滤(过滤任何 >= 1000 毫秒),但我也想过滤所涉及的数据库名称。
当我将跟踪定义从 SQL Profiler 导出到*.sql
文件时,我似乎没有发现对数据库名称的任何过滤:
-- lots of other stuff up here - setting up trace events and so on...
-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint
exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - 100479e4-6eeb-4608-af17-64141f1631ec'
set @bigintfilter = 1000000
exec sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter
....
那是怎么回事?为什么我可以指定要过滤的数据库名称 - 但跟踪定义最终不包含它?
- 这是否意味着服务器端跟踪总是只检查它正在创建的数据库?
- 但是为什么我可以按数据库名称指定过滤器呢?
- 这是否也意味着无法对例如死锁进行跨数据库服务器范围的跟踪?
更新:经过一番折腾,我得出以下结论:
在我的情况下,数据库名称的过滤器未应用于
Create Trace
脚本,因为我最终只选择了Locks / Deadlock Graph
事件 - 并且该事件没有将 aDatabase Name
作为事件列公开如果我选择其他事件,例如
RPC completed
将公开为事件列,我可以过滤并且该过滤器也正确添加到脚本中。Database Name
Database Name
Create Trace
我无法弄清楚我是如何在 上实际定义过滤器的Database Name
,因为通常情况下,如果事件不公开列,则该列在Column filter
对话框中也不可用......
无论如何-出于我无法理解的任何原因(至少现在),Deadlock Graph
都不会暴露Database Name
,因此我也无法过滤该属性....
感谢所有帮助并提供有见地的评论!
不,服务器端跟踪的范围就是:服务器。当我创建(我认为是)确切的跟踪定义并将其导出时,我得到以下代码段:
我也在使用 SQL Server Profiler 2008 R2。如果您不对数据库名称进行过滤,那么您将捕获所有实例数据库的跟踪事件。至于为什么您的导出似乎没有包含过滤器的那部分,我不能肯定地说。我知道这是不言而喻的,但我会在您导出之前检查您在 Profiler 中的跟踪定义,以确保数据库名称实际上包含在过滤器中(再次,我知道您可能已经检查了两次和三次,但我有说出来)。
我不确定您的 Profiler 发生了什么,因为我之前能够做到这一点。有时,用于设置过滤的 GUI 有点混乱,如果您在跟踪对话框中更改某些内容,所有过滤器都会重置为默认值。尽管如此,我真的不记得我是使用 2008 R2 还是 2012 管理工具来生成我的脚本。
无论如何,这是执行您想要的过滤的代码:
MSDN:sp_trace_setfilter