2015-08-25 44 views
0

我發現SQL Server中的DML觸發器。我創建了一個觸發器,將所有插入註冊到另一個表中的一個表中。我想在update語句中做同樣的事情。TRIGGER後更新 - 獲取更新的數據

我INSERT觸發器:

CREATE TRIGGER trgSuppliersLogINSERT 
ON Production.Suppliers 
AFTER INSERT 
AS 
BEGIN 
    insert into [Production].SuppliersLog 
     (SupplierID, [Action], companynameChangedTo, contacnameChangedTo, contacttitleChangedTo, addressChangedTo, cityChangedTo, regionChangedTo, postalcodeChangedTo, countryChangedTo, phoneChangedTo, faxChangedTo) 
    SELECT 
     supplierid, 'INSERT', companyname, contactname, contacttitle, address, city, region, postalcode, country, phone, fax 
     FROM inserted 
END 
GO 

我試圖做同樣的與更新:

CREATE TRIGGER trgSuppliersLogINSERT 
    ON Production.Suppliers 
    AFTER UPDATE 
    AS 
    BEGIN 
     insert into [Production].SuppliersLog 
      (SupplierID, [Action], companynameChangedTo, contacnameChangedTo, contacttitleChangedTo, addressChangedTo, cityChangedTo, regionChangedTo, postalcodeChangedTo, countryChangedTo, phoneChangedTo, faxChangedTo) 
     SELECT 
      supplierid, 'UPDATE', companyname, contactname, contacttitle, address, city, region, postalcode, country, phone, fax 
      FROM updated 
    END 
    GO 

但正如你可能知道的 '更新' 表不存在。有沒有其他方法可以將更新的數據存入我的供應商日誌表中?謝謝。

+0

還有的插入新的數據。並刪除刪除/舊數據 –

+0

謝謝你們,不知道刪除表甚至存在。你比我想象的更多地幫助我^^ – Skylerdw

回答

0

當你更新一行時,你應該使用insertet表。 你可以使用一個觸發INSERT和UPDATE:

CREATE TRIGGER trgSuppliersLogINSERT 
ON Production.Suppliers 
AFTER INSERT,update 
AS 
BEGIN 
    insert into [Production].SuppliersLog 
     (SupplierID, [Action], companynameChangedTo, contacnameChangedTo, contacttitleChangedTo, addressChangedTo, cityChangedTo, regionChangedTo, postalcodeChangedTo, countryChangedTo, phoneChangedTo, faxChangedTo) 
    SELECT 
     supplierid, 'INSERT', companyname, contactname, contacttitle, address, city, region, postalcode, country, phone, fax 
     FROM inserted 
END 
GO 

如果刪除(表填充刪除操作後)已經排行動是更新,但如果刪除沒有任何行的行爲是插入

declare @rowcount int 
, @action varchar 
set @rowcount = select count(1) from deleted 
if(@rowcount == 0) 
set @action = 'insert' 
else 
@action = 'update' 

和使用選擇這樣的:

SELECT 
      supplierid, @action, companyname, contactname, contacttitle, address, city, region, postalcode, country, phone, fax 
      FROM inserted 
0

這是完全一樣的前一個觸發,查看Use the inserted and deleted tables

更新事務類似於刪除操作後插入操作;先將舊行復制到deleted表中,然後將新行復制到觸發器表和inserted表中。

如果你想既造成的UPDATE新舊值,則需要加入inserteddeleted表一起工作。