在没有 Profiler 的情况下记录查询文本

sud*_*ned 5 sql-server-2005 sql-server profiler

我正在将一个旧的、半损坏的 ASP.NET/SQL Server 应用程序移植到 PHP/PostgreSQL。我面临的折磨^H^H^H^H^H^H^H^H挑战是报告是由一系列二进制可执行文件完成的,因为显然我是一个坏人,需要受到惩罚。因此,我无权访问查询以移植它们。

那很好,我想。我可以运行查询分析器并记录 在夜间报告生成期间发生的所有SELECT 语句。

但事实证明,最初的开发人员通过运行不包含 Profiler 的 SQL Server Workgroup Edition 降低了成本。

我正在考虑使用触发器来获取这些查询,但我认为我不能在SELECT语句上使用触发器。逆向工程查询是可能的,但考虑到数据库的复杂性(多个,通常是递归的,表之间的关系,同名表的负载,其中有几个表多年没有更新,等等)我更喜欢有规范的查询参考。

我应该怎么做?有没有办法让 Profiler 在 Workgroup Edition 中运行?有没有办法在没有分析器的情况下启用查询日志记录?我并不担心性能,因为这个应用程序并没有得到特别频繁的使用,而且它在比应用程序要求的两个尺寸更强大的机器上运行。

Pau*_*ite 10

几个选项:

  1. 您可以从 SQL Server Developer、Standard、Enterprise 或 Evaluation Edition 的不同客户端工具安装中针对 Workgroup Edition 服务器使用 SQL Server Profiler。

  2. 使用半记录的跟踪标志 4032,如Tom LaRock 所述

  3. 评估第三方工具,例如免费的DataWizard SQL Performance ProfilerxSQL Profiler(一个实例免费)或ExpressProfiler(BSD 许可证)。

我的偏好可能是选项 (1),如有必要,下载评估版

  • 好吧,我不知道#1 会起作用。要试试那个。:) (3认同)

Gab*_*abe 5

如果您告诉 Profiler 不要过滤掉它自己的查询,您可能会看到它调用这些存储过程:

文档所述,您按以下顺序执行过程:

  1. 使用创建跟踪sp_trace_create
  2. 添加事件sp_trace_setevent
  3. (可选)使用sp_trace_setfilter.
  4. 以 开始跟踪sp_trace_setstatus
  5. 用 停止跟踪sp_trace_setstatus
  6. 用 关闭跟踪sp_trace_setstatus

您最终会得到一个.trc文件,然后您可以在 SQL Profiler 中打开该文件或使用fn_trace_gettable.

这是启动跟踪的示例脚本:

declare @rc int
declare @TraceID int

-- create the trace
exec @rc = sp_trace_create @TraceID output, 0, N'trace-filename'

-- set which events to capture
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 10, 1, @on
exec sp_trace_setevent @TraceID, 10, 2, @on
exec sp_trace_setevent @TraceID, 10, 6, @on
exec sp_trace_setevent @TraceID, 10, 9, @on
exec sp_trace_setevent @TraceID, 10, 10, @on
exec sp_trace_setevent @TraceID, 10, 11, @on
exec sp_trace_setevent @TraceID, 10, 12, @on
exec sp_trace_setevent @TraceID, 10, 13, @on
exec sp_trace_setevent @TraceID, 10, 14, @on
exec sp_trace_setevent @TraceID, 10, 15, @on
exec sp_trace_setevent @TraceID, 10, 16, @on
exec sp_trace_setevent @TraceID, 10, 17, @on
exec sp_trace_setevent @TraceID, 10, 18, @on
exec sp_trace_setevent @TraceID, 12, 1, @on
exec sp_trace_setevent @TraceID, 12, 6, @on
exec sp_trace_setevent @TraceID, 12, 9, @on
exec sp_trace_setevent @TraceID, 12, 10, @on
exec sp_trace_setevent @TraceID, 12, 11, @on
exec sp_trace_setevent @TraceID, 12, 12, @on
exec sp_trace_setevent @TraceID, 12, 13, @on
exec sp_trace_setevent @TraceID, 12, 14, @on
exec sp_trace_setevent @TraceID, 12, 15, @on
exec sp_trace_setevent @TraceID, 12, 16, @on
exec sp_trace_setevent @TraceID, 12, 17, @on
exec sp_trace_setevent @TraceID, 12, 18, @on

-- start the trace
exec sp_trace_setstatus @TraceID, 1
Run Code Online (Sandbox Code Playgroud)


Bac*_*its 2

使用内置的动态管理视图。AFAIK,它们在工作组版中工作得很好。

SELECT deqs.last_execution_time AS [Time], dest.TEXT AS [Query]
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY deqs.last_execution_time DESC
Run Code Online (Sandbox Code Playgroud)

/sf/ask/250536471/