为什么我无法在 SQL Server 中的跟踪上创建筛选器?

Mai*_*n21 4 sql-server trace

由于 SQL Server 版本过时,我必须使用服务器端跟踪来收集一些信息,但如果我尝试实现它,则会收到错误Filters with the same event column ID must be grouped together。我的代码:

exec sp_trace_setfilter 2, 10, 0, 7, N'SQL Server Profiler%'
exec sp_trace_setfilter 2, 10, 0, 7, N'DatabaseMail%'
exec sp_trace_setfilter 2, 10, 0, 7, N'SQLAgent%'
Run Code Online (Sandbox Code Playgroud)

知识库示例(https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-trace-setfilter-transact-sql?view=sql-server-ver16):

sp_trace_setfilter  1, 10, 0, 6, N'SQLT%';  
sp_trace_setfilter  1, 10, 0, 6, N'MS%';
Run Code Online (Sandbox Code Playgroud)

通常它可能是显而易见的事情,但我不知道为什么它不起作用(它不是分号)。
你们中有人有想法吗?

Dan*_*man 7

我收到错误“具有相同事件列 ID 的过滤器必须分组在一起”。

跟踪似乎已经在 ApplicationName 列(第 10 列)上有一个或多个过滤器,然后在其他列上有过滤器。当您添加另一个 ApplicationName 筛选器时,您会收到错误,因为该列与最后添加的筛选器不同。SQL 跟踪要求给定列上的所有过滤器按顺序添加(即“分组在一起”)。

问题脚本示例:

-- add application name not like filter
exec sp_trace_setfilter @TraceID, 10, 0, 7, N'Microsoft SQL Server Management Studio%'

-- add host name equal filter
exec sp_trace_setfilter @TraceID, 8, 0, 0, N'YourServer'

-- add another application name not like filter
-- this errs because the last filter added is not application name
exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler%'
Run Code Online (Sandbox Code Playgroud)

修复后的脚本:

-- add application name not like filters
-- this succeeds because the app name filters are grouped together
exec sp_trace_setfilter @TraceID, 10, 0, 7, N'Microsoft SQL Server Management Studio%'
exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler%'

-- add host name equal filter
exec sp_trace_setfilter @TraceID, 8, 0, 0, N'YourServer'
Run Code Online (Sandbox Code Playgroud)

请注意,此分组要求适用于初始跟踪创建脚本以及随后添加过滤器时。将另一个过滤器添加到跟踪时意味着以下情况之一适用:

  • 跟踪没有过滤器
  • 跟踪列上尚未有过滤器
  • 添加到跟踪的最后一个过滤器必须位于同一列上