2017-05-10 98 views
1

我需要執行「更新觸發器」,以將表位置更改插入到審計表中。更新的T-SQL觸發器審計

我知道如何訪問插入/刪除,爲新老值,但我不能似乎發現了什麼,我需要獲得該更新的不同列做的。(我知道光標使用等)

這裏我得到的時刻代碼(SRY是法語)

ALTER TRIGGER T_U_Locations ON Locations 
FOR UPDATE 
AS 
BEGIN 

--Definition des valeurs 
DECLARE @tempDuChangement VARCHAR(30); 
DECLARE @nomDuChampChange VARCHAR(64); 
DECLARE @idLocation INT; 
DECLARE @ancienneV VARCHAR(50); 
DECLARE @nouvelleV VARCHAR(50); 
DECLARE @raison VARCHAR(50); 


--Aquisition des valeurs sur les changement apportés 
SET @tempDuChangement = CONVERT(VARCHAR(30) , CURRENT_TIMESTAMP); 

SET @nomDuChampChange = --HERE GOES THE CURRENT UPDATED COLUMN 
SET @idLocation = (SELECT inserted.id FROM inserted); 

SET @ancienneV = (SELECT /*HERE GOES THE CURRENT UPDATED COLUMN*/ FROM deleted); 
SET @nouvelleV = (SELECT /*HERE GOES THE CURRENT UPDATED COLUMN*/ FROM inserted); 

-- Crée une nouvelle entré dans la table Audits avec les information relative 
INSERT INTO Audits 
VALUES 
(
    @tempDuChangement, 
    @nomDuChampChange, 
    @ancienneV, 
    @nouvelleV, 
    @idLocation, 
    'raison test' 
) 
END 
+0

參考:https://docs.microsoft.com/en-us/sql/t-sql/functions/update-trigger-functions-transact-sql – FLICKER

+1

「插入」和「刪除」是表,以便他們可以表示集合操作的結果。設計一個觸發器,假設它總是處理一行,通常是一個糟糕的計劃。如果你絕對肯定永遠不會有多行,那麼_please_添加一個行數檢查,並使用'RaIsError'或'Throw'來明確告知那些稍後來到的人他們試圖執行一個不可接受的語句。 ('if(從插入中選擇Count(*))> 1 RaIsError('FooTable_Insert:不會超過一行可以被處理',25,42)with log') – HABO

回答

0

假設id是唯一的(並且在更新沒有改變),我htink你想:

insert into Audits (time, columnName, oldValue, newValue . . .) -- always include the column list 
    select Current_Timestamp, v.colname, v.oldValue, v.newValue, . . . 
    from inserted i join 
     deleted d 
     on i.id = d.id outer apply 
     (values ('col1', d.col1, o.col1), 
       ('col2', d.col2, o.col2), 
       ('col3', d.col3, o.col3), 
       . . . 
     ) v(colname, oldValue, newValue) 
    where v.oldValue <> v.newValue or 
      v.oldValue is null and v.newValue is not null or 
      v.oldValue is not null and v.newValue is null; 

基本上,您使用outer apply來清除數據,因此您需要包含所有列。 where子句然後獲得已被修改的子句。