SQL Server 触发器的编写问题?

纳尼 2013-01-30 11:24:05
数据库主要有两个表, 一个是分类表,一个是功能表
分类表字段:
ID // 分类ID
Name // 名称
ParentID // 父分类ID
功能表字段
ID // 功能ID
Name // 名称
CategoryID // 所属分类

其中分类表自身存在主外键关系(ParentID和分类.ID),另外功能表与分类表存在主外键关系(CategoryID和分类.ID)

以下是我写的触发器, 期望的功能是:当删除某一分类时,同时删除该分类下的子功能和子分类.
ALTER TRIGGER [Trg_DelCategories]
ON [dbo].[Categories]
INSTEAD OF DELETE
AS
BEGIN
DECLARE @ID nvarchar(50);
SELECT @ID = ID FROM Deleted;

DELETE FROM dbo.Features WHERE CategoryID=@ID;
DELETE FROM dbo.Categories WHERE ParentID=@ID;
DELETE FROM dbo.Categories WHERE ID=@ID;

END


但是,在测试中出现了外键约束的错误: 冲突发生于约束"FK_Features_Categories" 冲突字段为:功能.CategoryID
...全文
182 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390359568 看看这个。
昵称被占用了 2013-01-30
  • 打赏
  • 举报
回复
解决方案2,触发器需要重写,你原来的写法本来就有问题,依次如果删除多行数据就有问题 而且,需要考虑触发器代替原来的约束功能,一个INSTEAD OF DELETE不足以实现所有需求 写起来有点复杂,懒得写了
纳尼 2013-01-30
  • 打赏
  • 举报
回复
引用 1 楼 Haiwer 的回复:
只能选择两个之一 1、设置外健,并选择级联删除 2、不能设置外健,使用触发器进行外键检查和级联删除功能 首选应该是1,即你把外键修改为级联删除,删除触发器即可
对于解决方案1, 可实现大部分功能, 唯独不能实现的是,当删除父分类时无法级联删除子分类, 因为在这个外键关系中的"删除规则"是灰的,不能将其设置为"层叠". 对于解决方案2, 如果使用的是目前的触发器, 那也无法实现全部要求, 原因是:当执行语句
DELETE FROM dbo.Categories WHERE ParentID=@ID;
时并不会递归, 因此导致在删除所有@ID分类的子分类之后并不会删除@ID分类的子分类中的功能. 归根到底: 主要问题就是语句
DELETE FROM dbo.Categories WHERE ParentID=@ID;
并不导致触发器递归.
知识青年 2013-01-30
  • 打赏
  • 举报
回复
你这样搞。直接弄个级联删除好了
昵称被占用了 2013-01-30
  • 打赏
  • 举报
回复
只能选择两个之一 1、设置外健,并选择级联删除 2、不能设置外健,使用触发器进行外键检查和级联删除功能 首选应该是1,即你把外键修改为级联删除,删除触发器即可
  • 打赏
  • 举报
回复
引用 6 楼 andrew28 的回复:
引用 5 楼 sadasasdasd 的回复:http://bbs.csdn.net/topics/390359568 看看这个。 谢谢, 可惜没有我需要的
要不你就用事务,来处理你这个不行吗?
starseeker7 2013-01-30
  • 打赏
  • 举报
回复
触发器太纠结 管理也不方便,还不如做成SP,所有的delete调用SP实现 这样也可以避免批量处理的时候造成其他问题
纳尼 2013-01-30
  • 打赏
  • 举报
回复
引用 5 楼 sadasasdasd 的回复:
http://bbs.csdn.net/topics/390359568 看看这个。
谢谢, 可惜没有我需要的
内容概要:本文介绍了SQL ServerSQL触发器的概念及其使用方法。触发器是一种在特定表上的特定操作(如Insert、Update或Delete)发生时自动执行的特殊存储过程。文章以具体的案例详细解析了如何创建Update和Delete触发器以维护多表之间的数据一致性。例如,在学生学号变更时,同时更新其借阅记录中的学号;当删除某个学生信息时,同步删除相关的借书记录。此外,还提供了两个触发器的应用实例——库存管理系统中的卷烟销售和库存维护,演示了如何确保数据符合预设的业务规则,包括检查库存数量是否足够以及在销售后更新库存信息。 适合人群:有一定SQL基础的数据库管理员或开发人员,特别是那些希望深入了解SQL Server触发器的工作原理和应用场景的人。 使用场景及目标:①理解触发器在维护数据完整性和一致性方面的作用;②学会编写Insert、Update、Delete类型的触发器来实现自动化数据管理;③通过实际案例加深对临时表(Deleted, Inserted)的理解和运用。 阅读建议:为了更好地掌握触发器的实际应用,请读者结合提供的代码案例动手实践,并仔细分析每个步骤背后的逻辑,特别是如何利用Deleted和Inserted这两个临时表来完成复杂的数据操作。同时,注意观察不同场景下触发器带来的数据变化效果,增强对触发器机制的认识。

22,295

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧