sql-server - 删除触发器上的 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图:
解决方案
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 图中,我看到您还将付款和其他行存储在链接到菜的其他表中。您还需要删除这些行。
但删除付款并不是我希望在我的数据库中看到的事情。
你确定这是你想做的吗?
推荐阅读
- java - QueryDSL谓词绑定多个路径之间的“或”
- php - SMTP 功能不工作,执行时间超过
- batch-file - 如何将文件移动到另一个目录,如果存在相同的文件名,用 old_filename 重命名旧文件
- javascript - 如何在 x 动作后触发 var
- git - 获取从远程分支到本地孤立分支的完整提交历史记录
- r - 匹配R中字符串中的单个字符
- javascript - 如何根据对窗口确认()方法的回答在不同的 window.locations 之间切换
- react-native - 跟踪来自 Facebook 和 Instagram 的应用下载
- maven - compile和provided有什么区别
- python - 内联python脚本的命令行参数?