2015-08-18 355 views
2

需要在刪除時運行的觸發器。 我寫的代碼不起作用:它觸發了觸發器,但沒有插入任何記錄。刪除觸發器不插入記錄

我希望它在審計表中插入要刪除的行。

我的代碼:

CREATE TRIGGER [EXERCISE].[delete_trigger] ON [EXERCISE].[Fact_Sales] 
AFTER DELETE 
AS 
     INSERT INTO [EXERCISE].[Fact_Sales_Audit](City_ID,Product_ID,Time_ID,Created_Date,Updated_Date) 
     SELECT F.City_ID,F.Product_ID,F.Time_ID,F.Created_Date,F.Updated_Date 
     FROM [EXERCISE].[Fact_Sales] F 
     JOIN deleted D 
     ON F.Fact_Sales_ID = D.Fact_Sales_ID 
     PRINT 'Deleted row entered.' 

這是行不通的。我懷疑的原因是 - 在觸發器被觸發之前該行將被從表中刪除,這就是爲什麼它無法加入並因此不能插入任何記錄。但是,當我調試和打印消息時,我可以看到觸發發生在刪除之前。

有人能解釋我這個觸發器到底有多準確嗎?

+0

如果你想confrm可以觸發轉換爲dellete之前執行,如果該行不獲取插入東陽的原因,你說,這將被插入即可。 – learningNew

回答

1

您正在刪除[EXERCISE].[Fact_Sales]表中的行,但在您的觸發器中您將加入此表,期望記錄仍然存在 - 它們不是。

此時,Deleted僞表的模式與[EXERCISE].[Fact_Sales]表具有相同的模式,但其中包含剛刪除的行。而不是試圖加入回表,你知道是不是有更多的行,就直接使用Deleted表您的插入:

CREATE TRIGGER [EXERCISE].[delete_trigger] 
ON [EXERCISE].[Fact_Sales] 
AFTER DELETE 
AS 
    INSERT INTO [EXERCISE].[Fact_Sales_Audit](City_ID,Product_ID,Time_ID,Created_Date,Updated_Date) 
    SELECT D.City_ID, 
      D.Product_ID, 
      D.Time_ID, 
      D.Created_Date, 
      D.Updated_Date 
    FROM deleted D 

觸發確實火災後在主表中刪除,如AFTER DELETE語法暗示。它在執行刪除語句之間和將控制權返回給用戶之間的某個地方觸發。它發生在相同的交易中 - 例如如果刪除由於某種原因而回滾,觸發器執行的插入操作也將被回滾。

0

您應該簡化觸發器定義以從虛擬表DELETED中提取剛刪除的行。會發生什麼情況是您的刪除行將被臨時存儲在該表中,然後將被插入到審計表中。 注意!確保你在Fact_Sales表上設置了主鍵。

CREATE TRIGGER [delete_trigger] ON [Fact_Sales] 
FOR DELETE 
AS 
    INSERT INTO [Fact_Sales_Audit](Fact_Sales_Id,City_ID,Product_ID,Time_ID,Created_Date,Updated_Date) 
    SELECT Fact_Sales_Id,City_ID,Product_ID,Time_ID,Created_Date,Updated_Date 
    FROM DELETED