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 中執行?有沒有辦法在沒有探查器的情況下啟用查詢日誌記錄?我不擔心性能,因為這個應用程序沒有得到特別大量的使用,並且它執行在比應用程序所需的兩個尺寸更強大的機器上。
幾個選項:
- 您可以從 SQL Server Developer、Standard、Enterprise 或 Evaluation Edition 的不同客戶端工具安裝中針對 Workgroup Edition 伺服器使用 SQL Server Profiler。
- 正如Tom LaRock所解釋的,使用半記錄的跟踪標誌 4032 。
- 評估第三方工具,例如免費的DataWizard SQL Performance Profiler、xSQL Profiler(一個實例免費)或ExpressProfiler(BSD 許可證)。
我的偏好可能是選項 (1),如有必要,請下載評估版。
如果您告訴 Profiler 不要過濾掉自己的查詢,您可能會看到它呼叫這些儲存過程:
sp_trace_create
創建跟踪sp_trace_setevent
添加或刪除事件和列(只能在停止的跟踪上呼叫)sp_trace_setfilter
將過濾器應用於跟踪(只能在停止的跟踪上呼叫)sp_trace_setstatus
開始和停止跟踪如文件所述,您按以下順序執行過程:
- 使用創建跟踪
sp_trace_create
。- 使用 . 添加事件
sp_trace_setevent
。- (可選)使用 設置過濾器
sp_trace_setfilter
。- 用 開始跟踪
sp_trace_setstatus
。- 停止跟踪
sp_trace_setstatus
。- 用 關閉跟踪
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