我有一堆脚本化的跟踪定义,用于不同级别的诊断,没有一个按主机名过滤。我今天需要按主机过滤流量,所以:
- 启动探查器
- 创建了一个空跟踪
- 添加 SP:开始/完成
- 在主机名上设置过滤器
- 脚本化到 test.sql 文件
在 SSMS 中打开文件,没有过滤器的迹象。冲洗,重复,再次相同。假设我在做一些愚蠢的事情,我查找了要使用的值(比它应该更难找到!)并手动添加到我的跟踪定义中,这很有效。
EXEC sp_trace_setfilter @TraceId, 8, 0, 6, N'MyHostName'
回来检查为什么我不能从 Profiler 得到这个工作和相同的结果。我发现在从 SSMS 编写 2000 年的脚本跟踪时提到这是一个问题,但没有提到 SSMS2005/2008 到 2005/2008 服务器的这种情况。这是 Profiler 中的错误吗?
在 Profiler 2005 中生成脚本时,为逻辑运算符保存的默认值是 1='OR',因此跟踪将捕获比我们最初预期的更多的信息。
在 Profiler >=2008 中,脚本对要过滤的列的第一次出现具有 0(AND)。
这看起来像是 Profiler 2005 中的一个错误。
您需要检查服务器跟踪文件是否在所有事件的列列表中添加了该列。因此,如果您有事件 10 和 12(RPC:Completed 和 SQL:BatchCompleted),则必须对所有列运行 sp_trace_setevent,包括列 Hostname:
其中 10 和 12 - 事件和 8 - 列主机名
sp_trace_setevent说:
"用户必须为每个事件添加的每一列执行 sp_trace_setevent。在每次执行期间,如果 @on 设置为 1,则 sp_trace_setevent 会将指定的事件添加到跟踪的事件列表中。如果设置为 0,则 sp_trace_setevent 删除列表中的指定事件。”
之后,过滤器应该能够正常工作。