需要在删除时运行的触发器。 我写的代码不起作用:它触发了触发器,但没有插入任何记录。
我希望它在审核表中插入要删除的行。
我的代码:
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 :(得分: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