我的数据库是用powerDis..建模弄出来的,自己写了几个存储过程,现在创建了一个触发器,触发器我纳闷了
其实,事情是这样的:这样一个数据库,用户表,UserId(PK)日志表,DIaryId(Pk) UserId(FK)留言表,LeaveID(PK) UserId(FK)日志评论表CommentId(pk) DiaryId(Fk)
我创建了两个触发器(1)
ALTER TRIGGER [Tri_User_Delete]--穿件删除用户的触发器
ON dbo.[User] instead of DELETE
AS
begin
DECLARE @id INT--用户编号
SELECT @id=UserNum FROM DELETED--找到用户编号
DELETE dbo.Diary WHERE dbo.Diary.UserNum=@id--删除用户的日志
DELETE dbo.Leave WHERE dbo.Leave.UserNum=@id--删除用户留言
DELETE dbo.[User] WHERE dbo.[User].UserNum=@id
END第二个
ALTER TRIGGER [Tri_Diary_Delect]
ON [dbo].[Diary] INSTEAD OF DELETE
AS
begin
DECLARE @id INT--日志id
SELECT @id=DiaryNum FROM deleted
DELETE dbo.[Comment] WHERE dbo.Comment.DiaryNum=@id--删除日志的评论
DELETE dbo.Diary WHERE DiaryNum=@id
END这样两个触发器,
此时,用户编号为3的用户有多条日志,并且有多条评论,多条留言,执行第二个触发器,可以删除日志于其下的评论,执行第一个触发器的时候DELETE [User] WHERE UserNum=3,问题出现了,如果用户只有一条日志的,那么没问题,正常运行,如果用户有多条日志的话,那么就出问题了,主键于外键,我查找了半天,发现一个问题,第一个触发器执行一次只能删除一条记录,每次执行都只能删除一片日志这是为什么呢?
是什么原因导致每次只删除一条记录呢?搞不明白,真是郁闷了。求助。
其实,事情是这样的:这样一个数据库,用户表,UserId(PK)日志表,DIaryId(Pk) UserId(FK)留言表,LeaveID(PK) UserId(FK)日志评论表CommentId(pk) DiaryId(Fk)
我创建了两个触发器(1)
ALTER TRIGGER [Tri_User_Delete]--穿件删除用户的触发器
ON dbo.[User] instead of DELETE
AS
begin
DECLARE @id INT--用户编号
SELECT @id=UserNum FROM DELETED--找到用户编号
DELETE dbo.Diary WHERE dbo.Diary.UserNum=@id--删除用户的日志
DELETE dbo.Leave WHERE dbo.Leave.UserNum=@id--删除用户留言
DELETE dbo.[User] WHERE dbo.[User].UserNum=@id
END第二个
ALTER TRIGGER [Tri_Diary_Delect]
ON [dbo].[Diary] INSTEAD OF DELETE
AS
begin
DECLARE @id INT--日志id
SELECT @id=DiaryNum FROM deleted
DELETE dbo.[Comment] WHERE dbo.Comment.DiaryNum=@id--删除日志的评论
DELETE dbo.Diary WHERE DiaryNum=@id
END这样两个触发器,
此时,用户编号为3的用户有多条日志,并且有多条评论,多条留言,执行第二个触发器,可以删除日志于其下的评论,执行第一个触发器的时候DELETE [User] WHERE UserNum=3,问题出现了,如果用户只有一条日志的,那么没问题,正常运行,如果用户有多条日志的话,那么就出问题了,主键于外键,我查找了半天,发现一个问题,第一个触发器执行一次只能删除一条记录,每次执行都只能删除一片日志这是为什么呢?
是什么原因导致每次只删除一条记录呢?搞不明白,真是郁闷了。求助。
解决方案 »
- 求ASP.NET水晶报表实例 谢谢!
- 我想在我的网页上显示外部网页的一部分,有什么好办法?
- 会asp.net&sqlsever的朋友进来 , 合作一个大的网站
- 好急啊,帮我看看这样行不行呢?
- 请问如何把数据库的数据写成txt文本文件?最好有例子多谢了!
- 新人求简易留言板源程序
- 兄弟们来控讨一下,鄙人想开发一套企业级(大型)的应用系统。请问是构建在J2EE上好呢还是.NET上好?
- 在哪里能下载到Visul Studio.net 2003安装软件包
- win server 2008 iis asp.net,IE崩溃?
- 来者有分:如何获得点击DataGrid控件单元格的内容?
- asp.net使用js中的window.open为什么要按ctrl键才可以打开
- ASP.NET怎么调用JS文件中的方法
DELETE dbo.Diary WHERE DiaryNum=@id于是第一个触发器在删除diary数据的时候,就会递归触发,直到达到最大递归限制,然后就报错.但是第一个触发器没有检查错误,于是假象就出现了.
如果你是使用SQL Server,那么我要一定会说你在“扯淡”,我会调查你是学过软件专业的,还是业余自学的。SQL Server的触发器是针对数据集的,而不是单个记录。比如我在查询分析器上写:delete User where .....
(后边的子查询用于查询:所有在2010年12月份的留言中谈论过美国总统先生的人),触发器的deleted中就是一组记录而不是一个,你弄个@id我直接就把这类程序定义为产品这一锅粥中的一粒将来要发作的老鼠屎代码了。
自己考虑一下其他写法,我就懒得想了:ALTER TRIGGER [Tri_Diary_Delect]
ON [dbo].[Diary] INSTEAD OF DELETE
AS
begin
DECLARE @id varchar(100)--日志id
SELECT @id = isnull(@id,',') + DiaryNum + ',' FROM deleted
DELETE dbo.[Comment] WHERE charindex(',' + dbo.Comment.DiaryNum + ',',@id) > 0 DELETE dbo.Diary WHERE charindex(',' + DiaryNum + ',',@id) > 0
END