删除触发器不起作用而添加触发器正常工作?
Delete trigger doesn't work while add trigger work correctly?
删除触发器不起作用,而添加触发器正常工作。
它应该像这样工作:"When I delete a record in score table that has subject_id = 1 and score > 8, exellentEng will -1 in class table"
我不知道为什么。帮帮我
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
该行将不存在于 dbo_score
table 中,因为它是一个 after
触发器,因此该行已被删除。而是直接使用 Deleted
伪 table 例如
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
删除触发器不起作用,而添加触发器正常工作。
它应该像这样工作:"When I delete a record in score table that has subject_id = 1 and score > 8, exellentEng will -1 in class table" 我不知道为什么。帮帮我
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
该行将不存在于 dbo_score
table 中,因为它是一个 after
触发器,因此该行已被删除。而是直接使用 Deleted
伪 table 例如
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