删除触发器不插入记录

时间:2015-08-18 09:00:57

标签: sql sql-server triggers sql-server-2012

需要在删除时运行的触发器。 我写的代码不起作用:它触发了触发器,但没有插入任何记录。

  

我希望它在审核表中插入要删除的行。

我的代码:

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.'

它不起作用。我怀疑的原因是 - 在触发触发器之前从表中删除了行,这就是为什么它不能加入因此不插入任何记录。但是当我调试和打印消息时,我可以看到触发在删除之前发生。

有人可以解释一下这个触发器究竟是如何工作的吗?

2 个答案:

答案 0 :(得分: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语法所暗示的那样。它在执行delete语句之间和控制返回给用户之间触发。它发生在同一交易中 - 例如如果删除因任何原因而被回滚,则触发器执行的插入也将被回滚。

答案 1 :(得分:0)

您应该简化触发器定义,以便从虚拟表DELETED中获取刚刚删除的行。会发生什么情况是您删除的行将临时存储在该表中,然后将插入到审计表中。 NB!确保在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