2012-10-05 57 views
0

我正在處理由另一個程序員團隊維護多年的SQL Server 2008安裝。如何弄清楚爲什麼行從我的SQL服務器上消失?

我有數據的行似乎神祕地從一個特定的表在我的服務器消失的問題。

我希望能夠建立某種形式的監控系統會告訴我,當表被修改,而修改的總結。

我認爲「觸發」可能是什麼我要找的,但我從來沒有使用過。觸發器是我想要使用的,如果是這樣,那麼學習使用它們的好資源是什麼?有更好的解決方案嗎?

我認爲我應該提一下,我指的表是不是經常更新,所以我不認爲增加開銷的一點點應該是一個大問題,但我寧願一個解決方案,一旦問題解決,我可以刷掉。

+0

您不能檢查與數據庫交互的代碼嗎? –

+0

我徹底檢查了代碼並找不到任何東西。 –

+0

可能sql分析器是一個選項? – rene

回答

0

我想你已經想通了。觸發器可能是您最好的選擇,因爲它與您所能獲得的數據一樣接近。檢查代碼(編程甚至是存儲過程)不會像觸發器那樣給你一個保證;在這種情況下是刪除觸發器。

看看這篇文章:http://www.go4expert.com/forums/showthread.php?t=15510

+0

觸發器是否可以提供有關觸發它的SQL語句的信息? –

+0

不是本身;觸發器實際上是爲了在DML語句中注入代碼。我發現了一個類似的問題[這裏](http://stackoverflow.com/questions/3094735/create-trigger-to-log-sql-that-affected-table/3149717#3149717)。該解決方案要求使用系統模式的dm_exec_query_stats和dm_exec_sql_text函數。一個小的查詢可能會揭示執行刪除操作的最後一個語句,並且您可以在不使用觸發器的情況下使用它。由於只存儲了一定數量的查詢(天),因此觸發器仍然派上用場。 – Draghon

+0

在你引用的文章,它解釋了觸發器可以利用inserted'的'和'deleted'臨時表,讓我看到的是被插入或刪除的數據。這正是我需要的。 –

1

另一個解決方案是附加Sql Profiler到具體情況數據庫。這將記錄每個查詢運行您的檢查。

我喜歡從觸發器遠離,但他們可以幫助您的問題像Draghon說

2

一個進行刪除觸發可以幫助您捕捉被刪除的行。你可以創建一個審計表,然後將此代碼添加到您的觸發器(你想監控表的複印件):

INSERT INTO [Your Audit Table] 
SELECT * FROM deleted 

我也看到了涉及FOR XML一些「更高級」的情景。

我不知道觸發器有助於確定誰正在刪除記錄,但是您可能能夠證明記錄正在被刪除,可能是什麼時候等。這可以幫助您進一步排除故障。

2

以下示例應該是您正在查找的基本概念。

CREATE TABLE MyTestTable(col1 int, col2 varchar(10)); 
GO 

CREATE TABLE MyLogTable(col1 int, col2 varchar(10), ModDate datetime, ModBy varchar(50)); 
GO 

CREATE TRIGGER tr_MyTestTable_IO_UD ON MyTestTable AFTER UPDATE, DELETE 
AS 
    INSERT MyLogTable 
    SELECT col1, col2, GETDATE(), SUSER_SNAME() 
    FROM deleted; 
GO 

Insert MyTestTable Values (1, 'aaaaa'); 
Insert MyTestTable Values (2, 'bbbbb'); 
UPDATE MyTestTable Set col2 = 'bbbcc' WHERE col1 = 2; 
DELETE MyTestTable; 
GO 

SELECT * FROM MyLogTable; 
GO 

但是,請記住,仍然有辦法刪除不會被觸發器捕獲的記錄。 (TRUNCATE TABLE和各種批量更新命令)。

相關問題