2010-05-18 58 views
1

希望你能提供幫助。SQL-Server:是否有相當於一般存儲過程執行的觸發器

是否有一種方法可以可靠地檢測存儲過程何時在SQL Server上運行而不更改SP本身?

這是要求。我們需要跟蹤從我們的企業數據倉庫運行報告的用戶,因爲我們使用的核心產品不允許這樣做。核心產品報告和我們添加的大量內部產品報告都會從個別存儲過程中返回數據。

我們沒有一種實際的方法來改變產品網頁中調用報告的部分。我們也無法更改核心產品報告的存儲特效。 (將一條記錄行添加到每個內部記錄行的開始/結尾處將是微不足道的)。

因此,我試圖找到的是SQL Server(2005/2008)是否有辦法在任何其他存儲過程運行時執行日誌存儲過程,而無需改變這些存儲過程本身。

我們對SQL Server實例本身有一般控制權,因爲它本地化,我們只是不想改變產品存儲過程本身。

任何人有任何想法?有沒有一種「存儲過程執行觸發器」?是否有SQL Server的事件模型,我們可以將自定義的.Net代碼綁定到? (只是從一開始就打折了,我們想嘗試做出改變到SQL Server,而不是進入捕獲報告從產品網頁等正在運行)

思想認識
感謝

+0

目前還不清楚您的最終目標是什麼,但是如果您只想記錄日誌 - 可能啓用C2審覈是您所需要的:http://msdn.microsoft.com/en-us/library/ms187634.aspx – 2010-05-18 16:00:06

+0

澄清,我需要記錄執行的存儲過程名稱,時間和用戶/登錄執行。謝謝你看看這個。 – Ray 2010-05-18 16:23:27

回答

5

你可以設置當SQL Server初始化時自動運行後臺跟蹤。然後,在你的蹤跡中,你可以輸出trace語句到一個表格。

例如,打開SQL Server Profiler。創建你想要的跟蹤,即包括SP:開始和你想要的列。還選擇將跟蹤保存到表中。

現在,設置腳本後,選擇文件/導出/腳本跟蹤定義。這將創建一條生成跟蹤的SQL語句。

接下來,創建一個使用SQL創建此跟蹤的存儲過程。安裝在主數據庫中的proc和告訴SQL Server在啓動時自動運行:

exec sp_procoption N'sp_MyProc', N'startup', N'true' 

現在每次SQL Server重新啓動,它會自動配置跟蹤,和所有的SP調用將被記錄到一個表。

- 編輯 -

也注意到,有一些動態管理視圖(DMV),用於監控存儲過程是有用的。兩個你可能感興趣的:

例如,sys.dm_exec_procedure_stats會告訴你,當PROC上次運行,它是如何運行的次數,最長的執行時間等。請注意,這些視圖僅影響當前在數據庫緩存中的存儲過程。如果proc被卸載,那麼將會是信息。

+0

好的回答.... – gbn 2010-05-18 16:08:47

+0

謝謝。交易方面的環境非常密集。任何想法這會增加什麼樣的開銷? – Ray 2010-05-18 16:25:26

+0

這些信息不會傳輸到SQL Server Profiler客戶端,因此不需要額外的網絡通信量。每個SP啓動都會被記錄下來,所以這意味着將單行INSERT插入到日誌表中。每天有多少SP被執行?這就是桌子的大小。請注意,如果擔心堵塞數據庫,則可以選擇登錄到文件。 – 2010-05-18 16:36:07

2

你只能使用SQL Profiler 可靠:沒有使用執行掛鉤或「執行觸發器」。

這樣說,你可以間接但不是100%可靠地監視計劃緩存。見this link。但是,如果您有OPTION RECOMPILE選項,則在使用後將其從緩存中刪除。此外,服務器啓動後,統計信息會重置,您需要運行dmv以查看緩存中的內容。

這取決於你需要多少徹底是...

+0

我們處理大量的業務報告。我們需要收集關於報告使用頻率以及有多少不同用戶的統計信息。它的重要性在於報告的表現並不影響我們記錄它被使用的頻率。即 - 我打折投票目前運行命令等,因爲這是更有可能檢測長期運行procs短期運行的。 – Ray 2010-05-18 16:32:23

+0

然後使用跟蹤:這是唯一的方法。看到保羅·威廉姆斯的答案爲「如何」 – gbn 2010-05-18 16:36:07

0

您可以使用一個工具,如SQL日誌救援(免費)查詢您的SQL日誌文件 http://www.red-gate.com/products/SQL_Log_Rescue/index.htm 它可以告訴你哪些存儲過程已運行&時。 這是最簡單的方法,因爲它不涉及修改任何現有的代碼,也不會增加服務器應用程序的開銷。

+0

感謝你看看。你知道嗎?是否有可能確定存儲的proc名稱和執行它的登錄名? – Ray 2010-05-18 16:33:46

+0

它是如何告訴你存儲過程運行的是什麼?如果這是一個報告應用程序,它只能讀取主要與nolog寫入「營救」... – gbn 2010-05-18 16:37:12