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
...全文
118 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
晴天恋 2013-01-30
http://bbs.csdn.net/topics/390359568 看看这个。
  • 打赏
  • 举报
回复
解决方案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;
并不导致触发器递归.
  • 打赏
  • 举报
回复
你这样搞。直接弄个级联删除好了
  • 打赏
  • 举报
回复
只能选择两个之一 1、设置外健,并选择级联删除 2、不能设置外健,使用触发器进行外键检查和级联删除功能 首选应该是1,即你把外键修改为级联删除,删除触发器即可
  • 打赏
  • 举报
回复
晴天恋 2013-01-30
引用 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 看看这个。
谢谢, 可惜没有我需要的
  • 打赏
  • 举报
回复
相关推荐
发帖
疑难问题
加入

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2013-01-30 11:24
社区公告
暂无公告