【问题标题】:Delete trigger doesn't work while add trigger work correctly?删除触发器不起作用,而添加触发器正常工作?
【发布时间】:2020-03-20 08:24:33
【问题描述】:

删除触发器不起作用,而添加触发器正常工作。

它应该像这样工作:“当我在 score 表中删除一条 subject_id = 1 且 score > 8 的记录时,exellentEng 将在类表中为 -1” 我不知道为什么。帮帮我

ALTER TRIGGER [dbo].[deleteExellentEnglishStudent]
ON [dbo].[dbo_score]
AFTER DELETE AS 
    BEGIN
      UPDATE x SET
        exellent_Eng -=1
      FROM dbo.dbo_class x
      JOIN dbo.dbo_student s ON s.class_id = x.class_id
      JOIN dbo.dbo_score c ON c.student_id = s.student_id
      WHERE (c.subject_id = 1 AND c.score >= 8)
      and c.score_id in (SELECT Deleted.score_id FROM Deleted)
    END
ALTER TRIGGER [dbo].[addExellentEnglishStudent] ON [dbo].[dbo_score]
    AFTER INSERT AS 
    BEGIN
      UPDATE x SET
        exellent_Eng += 1
      FROM dbo.dbo_class x
      JOIN dbo.dbo_student s ON s.class_id = x.class_id
      JOIN dbo.dbo_score c ON c.student_id = s.student_id
      WHERE (c.subject_id = 1 AND c.score >= 8)
      AND c.score_id IN
      (select Inserted.score_id from Inserted)
    END

【问题讨论】:

  • 添加一些选择语句,例如select * from Deleted 到触发器,然后从 SSMS 中删除,这样您就可以看到结果。然后进行类似于您的更新的选择,这样您就可以看到发生了什么。

标签: sql-server tsql database-trigger


【解决方案1】:

dbo_score 表中不存在该行,因为它是一个after 触发器,因此该行已被删除。而是直接使用Deleted 伪表,例如

ALTER TRIGGER [dbo].[deleteExellentEnglishStudent]
ON [dbo].[dbo_score]
AFTER DELETE AS 
BEGIN
  UPDATE x SET
    exellent_Eng -=1
  FROM dbo.dbo_class x
  JOIN dbo.dbo_student s ON s.class_id = x.class_id
  JOIN dbo.Deleted c ON c.student_id = s.student_id
  WHERE (c.subject_id = 1 AND c.score >= 8)
END

注意:正如我在您的另一个问题上所说,如果它们每次都绝对计算值,而不是处理差异,您可能会发现编写和维护这些触发器更容易。然后您可以使用相同的逻辑进行插入、更新和删除,例如类似:

ALTER TRIGGER [dbo].[deleteExellentEnglishStudent]
ON [dbo].[dbo_score]
AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
  UPDATE x SET
    exellent_Eng = (select count(*) from dbo.dbo_score where c.subject_id = 1 AND c.score >= 8)
  FROM dbo.dbo_class x
  JOIN dbo.dbo_student s ON s.class_id = x.class_id
  where S.studentid in (select student_id from Inserted union all select student_id from Deleted)
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多