【问题标题】:Delete trigger not inserting record删除触发器不插入记录
【发布时间】:2015-11-11 03:04:05
【问题描述】:

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

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

我的代码:

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

它不工作。我怀疑的原因是 - 在触发触发器之前,该行已从表中删除,这就是它无法加入并因此无法插入任何记录的原因。但是当我调试和打印消息时,我可以看到触发发生在删除之前。

谁能解释一下这个触发器是如何工作的?

【问题讨论】:

  • 如果你想确认,你可以将触发器转换为删除之前并执行,如果行没有被插入,因为你说它会被插入。

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


【解决方案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 语法所暗示的那样。它在执行删除语句时和控制权返回给用户之前的某个地方触发。它发生在同一个事务中 - 例如如果删除由于某种原因被回滚,则触发器执行的插入也将被回滚。

【讨论】:

    【解决方案2】:

    您应该简化触发器定义以从虚拟表 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 2011-03-17
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多