2016-11-04 123 views
1

我正在使用SQL Server 2012 Express,由於我真的習慣了PL/SQL,所以有點難以找到我的T-SQL問題的一些答案。觸發記錄插入/更新/刪除的值SQL Server 2012

我有什麼:約7臺具有鮮明的列和另外一個來自其他7

問題記錄插入/更新/刪除值:我怎麼能爲每個表創建一個觸發器,它將修改後的數據存儲在Log表中,考慮到我無法使用更改數據捕獲,因爲我正在使用SQL Server Express版本?

附加信息:Logs表中只有兩列需要幫忙填寫;從所有列的改變數據合併,下面的例子:

CREATE TABLE USER_DATA 
(
    ID INT IDENTITY(1,1) NOT NULL, 
    NAME NVARCHAR2(25) NOT NULL, 
    PROFILE INT NOT NULL, 
    DATE_ADDED DATETIME2 NOT NULL 
) 
GO 

CREATE TABLE AUDIT_LOG 
(
    ID INT IDENTITY(1,1) NOT NULL, 
    USER_ALTZ NVARCHAR(30) NOT NULL, 
    MACHINE SYSNAME NOT NULL, 
    DATE_ALTERERED DATETIME2 NOT NULL, 
    DATA_INSERTED XML, 
    DATA_DELETED XML 
) 
GO 

我需要幫助填充的列是最後兩個(DATA_INSERTEDDATA_DELETED)。我甚至不知道,如果數據類型應該是XML,但是當有人要麼

INSERTSUPDATES(僅適用於新的值)/更新的所有列中插入的所有數據USER_DATA應該以某種方式在合併DATA_INSERTED

DELETESUPDATES(僅適用於舊的值),刪除所有數據/更新的所有列的USER_DATA應該以某種方式對DATA_DELETED合併。

可能嗎?

+2

我寧願爲每個表而不是一個通用的審覈。它讓歷史變得更簡單。如果您將所有內容都存儲爲XML,則必須將所有的XML碎片化以查看歷史記錄。 –

+0

@SeanLange嗨,謝謝!我不知道「審計」。我谷歌搜索關於它,並找到了我想要的解決方案(種類,將不得不修改我的需要的過程)從[這個答案]的第一個鏈接(http://stackoverflow.com/a/17546860/2970272 )。請張貼它作爲答案,以便我可以接受它。乾杯! – mrbTT

+0

您鏈接的帖子幾乎描述了我正在談論的內容。我不關心這些觀點,我不想重寫那些只是爲了得到一些觀點。很高興你找到了一個可行的解決方案。 –

回答

0

只是張貼,因爲這是什麼解決了我的問題。正如用戶@SeanLange在我的文章的評論中所說的那樣,他對我說要使用"audit",我不知道它存在。

使用Google搜索它,導致我到this Stackoverflow answer其中第一個鏈接有一個程序創建觸發器和「影子」表做我需要的東西(它並沒有將所有值合併到一列中,但它適合工作)。

0

Use the inserted and deleted Tables

DML觸發器語句使用兩種特殊的表:deleted表和 插入的表格。 SQL Server自動創建並管理這些表。您可以使用這些臨時內存駐留表來 測試某些數據修改的影響,併爲DML觸發器操作設置條件 。您不能直接修改 表中的數據,也不能在 表上執行數據定義語言(DDL)操作,例如CREATE INDEX。在DML觸發器中,插入和刪除的表主要用於執行以下操作:在表之間擴展 參照完整性。插入或更新基於視圖的基表 中的數據。測試錯誤並根據 錯誤採取措施。查找數據修改之前表格狀態與 之間的差異,並根據該差異采取操作。

而且

OUTPUT Clause (Transact-SQL)

從返回的信息,或基於表達式,每行一個INSERT影響 ,UPDATE,DELETE或MERGE語句。這些結果可以是 返回給處理應用程序以用於諸如 確認消息,存檔以及其他此類應用程序 要求。結果也可以插入到表格或表格 變量中。此外,可以在嵌套的INSERT,UPDATE,DELETE或MERGE語句中捕獲OUTPUT 子句的結果,並將這些結果插入到目標表或視圖中。