Sql-Server

在沒有 Profiler 的情況下記錄查詢文本

  • May 20, 2015

我正在將一個舊的、半損壞的 ASP.NET/SQL Server 應用程序移植到 PHP/PostgreSQL。在我面臨的折磨^H^H^H^H^H^H^H^H挑戰中,報告是由一系列二進制執行檔完成的,因為顯然我是一個壞人,需要受到懲罰。因此,我無權訪問查詢以移植它們。

*沒關係,*我想。我可以執行查詢分析器並記錄 SELECT 在每晚報告生成期間發生的所有語句。

但事實證明,最初的開發人員通過執行不包括 Profiler 的 SQL Server Workgroup Edition 降低了成本。

我正在考慮使用觸發器來獲取這些查詢,但我認為我不能在SELECT語句上使用觸發器。對查詢進行逆向工程是可能的,但考慮到數據庫的複雜性(多個,通常是遞歸的,表之間的關係,負載類似名稱的表,其中有幾個多年來沒有更新,等等)我更喜歡規範查詢參考。

我該怎麼辦?有什麼方法可以讓 Profiler 在 Workgroup Edition 中執行?有沒有辦法在沒有探查器的情況下啟用查詢日誌記錄?我不擔心性能,因為這個應用程序沒有得到特別大量的使用,並且它執行在比應用程序所需的兩個尺寸更強大的機器上。

幾個選項:

  1. 您可以從 SQL Server Developer、Standard、Enterprise 或 Evaluation Edition 的不同客戶端工具安裝中針對 Workgroup Edition 伺服器使用 SQL Server Profiler。
  2. 正如Tom LaRock所解釋的,使用半記錄的跟踪標誌 4032 。
  3. 評估第三方工具,例如免費的DataWizard SQL Performance ProfilerxSQL Profiler(一個實例免費)或ExpressProfiler(BSD 許可證)。

我的偏好可能是選項 (1),如有必要,請下載評估版。

如果您告訴 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

引用自:https://dba.stackexchange.com/questions/29951