首页 > 解决方案 > 删除触发器上的 SQL Server 没有做我期望的事情

问题描述

删除菜肴时应触发触发器。所有包含这道菜的订单都将被删除。

到目前为止,我有这个脚本:

create trigger OnDishDeleted 
on Dish 
after delete as 
begin 
    delete from Dish_Order 
    where Dish_ID = (select Dish_ID from deleted) 
end

当我尝试删除一道菜时,我收到一个错误:

DELETE 语句与 REFERENCE 约束“FK_Dish_Order_Dish”冲突。冲突发生在数据库“davay_rabotai2”、表“dbo.Dish_Order”、列“Dish_ID”中。

ER图:

点击!

标签: sql-servertriggersdatabase-trigger

解决方案


instead of如果您需要先删除另一个表中的行,请使用触发器。
这是一个可以帮助您入门的示例。

CREATE trigger OnDishDeleted on dbo.Dish
instead of delete 
as
begin
     set nocount on

     delete from Dish_Order where Dish_ID in (select Dish_ID from deleted) 
     delete from Dish where Dish_ID in (select Dish_ID from deleted) 
end

与普通触发器的不同之处在于,您还需要Dish在此触发器中自己从表中删除行。触发器不会删除任何内容,它只是在给出删除语句时触发,您必须自己完成所有工作
instead of

更多信息
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017

https://msdn.microsoft.com/ zh-CN/图书馆/def01zh2.aspx

另请注意,我使用where 子句IN代替=了 where 子句,这是因为deleted在触发器中可以有不止一行。这是您的触发代码中的另一个缺陷。始终假设触发器中可以有不止一行。

也就是说,您的解决方案还有另一个问题。
从您的 ER 图中,我看到您还将付款和其他行存储在链接到菜的其他表中。您还需要删除这些行。
但删除付款并不是我希望在我的数据库中看到的事情。
你确定这是你想做的吗?


推荐阅读