我的数据库是用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,问题出现了,如果用户只有一条日志的,那么没问题,正常运行,如果用户有多条日志的话,那么就出问题了,主键于外键,我查找了半天,发现一个问题,第一个触发器执行一次只能删除一条记录,每次执行都只能删除一片日志这是为什么呢?
是什么原因导致每次只删除一条记录呢?搞不明白,真是郁闷了。求助。

解决方案 »

  1.   

    第二个触发器是建立在Diary上的DELETE触发器, 然后在触发器里又写了
     DELETE dbo.Diary WHERE DiaryNum=@id于是第一个触发器在删除diary数据的时候,就会递归触发,直到达到最大递归限制,然后就报错.但是第一个触发器没有检查错误,于是假象就出现了.
      

  2.   


    如果你是使用SQL Server,那么我要一定会说你在“扯淡”,我会调查你是学过软件专业的,还是业余自学的。SQL Server的触发器是针对数据集的,而不是单个记录。比如我在查询分析器上写:delete User where .....
    (后边的子查询用于查询:所有在2010年12月份的留言中谈论过美国总统先生的人),触发器的deleted中就是一组记录而不是一个,你弄个@id我直接就把这类程序定义为产品这一锅粥中的一粒将来要发作的老鼠屎代码了。
      

  3.   

    第一个触发器再加上 删除评论 ,不就可以了吗?另外mssql是后触发器,无论如果是不会回滚的,你这个代码,早晚会出现脏数据。正常的代码不应当使用触发器,而使用 事物进行处理,无论是存储过程的事物,还是用ado.net写。
      

  4.   

    找到问题了,楼的朋友说的对,4楼的朋友,我想问问,SELECT @id=UserNum FROM DELETED,这里怎么会是一组数据呢?UserNum是用户编号,主键,唯一的,我试试5楼朋友说的事物。
      

  5.   

    4楼说出了本质原因,具体修改方法如下,不过下面的方法 不能用到num字段上的索引,要用索引时可以
    自己考虑一下其他写法,我就懒得想了: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