mar*_*c_s 6 sql-server-2008-r2
我正在尝试在 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
....
Run Code Online (Sandbox Code Playgroud)
那是怎么回事?为什么我可以指定要过滤的数据库名称 - 但跟踪定义最终不包含它?
更新:经过一番折腾,我得出以下结论:
Create Trace
在我的情况下,数据库名称的过滤器未应用于脚本,因为我最终只选择了Locks / Deadlock Graph
事件 - 而该事件不会将 aDatabase Name
作为事件列公开
如果我选择其他事件一样,RPC completed
这也暴露了Database Name
作为一个事件列,我可以过滤的Database Name
,并且过滤器也被适当地加入到Create Trace
脚本。
我不知道我是如何在 上实际定义过滤器的Database Name
,因为通常情况下,如果事件不公开列,则该列在Column filter
对话框中也不可用....
无论如何 - 无论出于何种原因(至少现在),Deadlock Graph
都不会公开Database Name
,因此我也无法过滤该属性....
感谢所有帮助并提供有见地的评论!
这是否意味着服务器端跟踪始终只检查它所创建的数据库?
不,服务器端跟踪的范围仅限于:服务器。当我创建(我认为是)确切的跟踪定义并将其导出时,我得到以下片段:
-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint
set @bigintfilter = 1000000
exec sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter
exec sp_trace_setfilter @TraceID, 35, 0, 6, N'AdventureWorks'
-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1
Run Code Online (Sandbox Code Playgroud)
我也在使用 SQL Server Profiler 2008 R2。如果您不过滤数据库名称,那么您将捕获所有实例数据库的跟踪事件。至于为什么你的导出似乎不包括过滤器的那部分,我不能肯定地说。我知道这是不言而喻的,但在导出之前我会在 Profiler 中检查您的跟踪定义,以确保数据库名称实际上作为过滤器包含在内(同样,我知道您可能已经对此进行了两次和三次检查,但我有说出来)。
归档时间: |
|
查看次数: |
4660 次 |
最近记录: |