2010-11-03 102 views
0

我遇到了一個數據庫的問題,它似乎是一個錯誤的值更新列。目前,我不知道哪個程序正在執行此操作。什麼是最好的方法來找出這個問題?事情真的能幫助我是在助人爲樂的順序:如何在SQL Server 2005中更新列時記錄日誌?

  • 應用程序的名稱
  • 執行應用
  • 確切的SQL語句的主機。

事務日誌可以幫我嗎?我能否以某種方式編寫日誌記錄觸發器?

幫助將不勝感激。

+0

SQL只知道一樣關於調用應用程序的行。如果連接字符串中沒有提供該信息(顯式或默認),則SQL中不會包含該信息。 – 2010-11-03 13:44:48

回答

5

,因爲它提供的連接打開時您可以創建一個觸發器和一張桌子,沿

CREATE TRIGGER TRG_foo_U On foo FOR UPDATE 
AS 
SET NOCOUNT ON 

IF UPDATE(bar) 
    INSERT logtable 
    SELECT APP_NAME(), HOST_NAME(), SUSER_SNAME(), GETDATE(), * FROM INSERTED 
GO 
+2

不要忘記getdate(),來跟蹤何時嘗試更新! – 2010-11-03 13:42:43

+0

@Philip Kelley:呃......我們應該說我假定在列表中有一個GETDATE()默認列:-) – gbn 2010-11-03 14:40:16

+0

讓我們首先聲明:我對觸發器知之甚少。我得到以下內容:''UPDATED'不是一個公認的內置函數名稱。 'USER_SNAME'不是公認的內置函數名稱。'任何想法? (另外,我假設bar是列名?) – Martijn 2010-11-03 15:25:31

0

您可以嘗試使用SQL事件探查器查看針對數據庫進行的所有活動。

1

SQL事件探查器會給你這個信息,我相信你應該能夠應用一個過濾器,以便你需要捕獲該特定對象上的事件。

+0

我試着添加一個過濾器到對象(是表名),但是這似乎沒有過濾任何東西。這是一個相當忙碌的生產服務器,所以通過手工發現違規聲明就像在大海撈針一樣。我在哪裏可以找到更多有關過濾 – Martijn 2010-11-03 13:24:55

+0

當然得到正確的事件,並與正確的過濾器分析是棘手的。根據所選事件,您有興趣過濾的對象ID可能會或可能不會被事件知道。 http://support.microsoft.com/kb/303445 – 2010-11-04 12:52:31