2013-08-04 57 views
0

我有一個名爲「LogDelete」的表來保存有關刪除任何表上的任何行的用戶的信息。表中的字段是這樣的:創建觸發器在所有表上觸發

create table LogDelete 
(
    pk int identity(1,1) primary key, 
    TableName varchar(15), 
    DeleteUser nvarchar(20), 
    DeleteDate datetime 
) 

其實我想創建一個觸發器,火上更新操作中的所有表上每一次更新寫LogDelete表, 在現在正確的信息,我使用一個存儲過程,並調用它在我桌子上的每個更新操作上。 有沒有辦法做到這一點?

+0

你的所有表都有一列的int PK嗎?如果是,我確實有一個可以幫助你的解決方案。 – OzrenTkalcecKrznaric

回答

4

不是。有'事件'觸發器,但它們主要與loggin in相關。這些觸發器實際上是DDL觸發器,因此它們與更新數據無關,而是與更新數據庫方案無關。

Afaik,每次更新都沒有觸發器觸發。這意味着您現在通過存儲過程處理它的方式可能是最好的方法。您可以在每個表上創建觸發器來調用該過程並進行日誌記錄。

您甚至可以編寫一個腳本,在一次運行中爲您創建所有觸發器。這將使觸發器的初始創建和稍後更新更容易一些。

下面是一些MSDN documentation,它說(在備註有關DML觸發器):

CREATE TRIGGER必須是批處理的第一條語句和可以適用於只有一個表

+0

謝謝,你能寫出它的腳本嗎?我不知道如何創建一個腳本來爲所有表運行一次。 –

+0

看看這裏:http://www.sqlservercentral.com/Forums/Topic671140-359-1.aspx – GolezTrol

0

沒有爲你的要求沒有神奇的解決方案,沒有這樣的事,作爲event triggers所有DMLINSERTUPDATEDELETE),只要你喜歡,但也有一些替代品,你可以考慮:

  1. 如果您使用的是SQL Server 2008或之後的版本,您可以使用的最好的東西是CDCChange Data Capture),您可以從Dave Pinal的this article開始,我認爲這將是最好的方法,因爲它不受任何結構變化的影響。
  2. 閱讀日誌文件。你需要分析它在日誌中找到每個DML活動,因此你可以建立一個統一的操作來記錄你所需要的變化,顯然這不是在線的,也不是微不足道的
  3. 與選項2相同,但使用跟蹤所有的DML活動。這種方法的優點是它幾乎可以在線,不需要分析日誌文件,你只需要分析一個分析器表。