1
以前,我为插入,更新和删除操作分别创建了3个触发器。带插入,更新和删除的SQL Server触发器
当其中一个发生时,触发器应该修改另一个表中的值。
当我试图为所有3个行动一个组合触发器(插入,更新和删除),我试图执行它时,得到了许多错误。我已经试过了病例陈述和if陈述,但是不知道发生了什么问题。
CREATE TRIGGER multipurposeCourseEnrollment
ON courseEnrollment AFTER INSERT, DELETE, UPDATE AS
BEGIN
IF EXISTS(SELECT courseID FROM DELETED) AND EXISTS(SELECT courseID FROM INSERTED)
THEN
DECLARE @oldCourseID INT
DECLARE @newCourseID INT
SELECT @oldCourseID = (SELECT courseID FROM DELETED)
SELECT @newCourseID = (SELECT courseID FROM INSERTED)
BEGIN
UPDATE courses SET courseOpenSeats = (courseOpenSeats +1)
WHERE courseID = @oldCourseID
UPDATE courses SET courseOpenSeats = (courseOpenSeats -1)
WHERE courseID = @newCourseID AND courseOpenSeats>0
END
ELSE
IF EXISTS(SELECT courseID FROM DELETED)
THEN
DECLARE @courseIDDel INT
SELECT @courseIDDel = (SELECT courseID FROM DELETED)
BEGIN
UPDATE courses SET courseOpenSeats = (courseOpenSeats +1)
WHERE courseID = @courseIDDel
END
ELSE
IF EXISTS(SELECT courseID FROM UPDATED)
THEN
DECLARE @courseID INT
SELECT @courseID = (SELECT courseID FROM UPDATED)
BEGIN
UPDATE courses SET courseOpenSeats = (courseOpenSeats - 1)
WHERE courseID = @courseID AND courseOpenSeats>0
END
ELSE
END)
END;
一个问题可能是我如何声明@variables
。不知道这是否正确。
我得到的错误是:
关键字 '然后' 附近有语法错误。
我也得到本作ELSE
非常诚实:我建议有**三个单独的**触发器 - 这很容易处理,如果需要可以禁用INSERT触发器,并且每个触发器中的代码量恰好在一个可管理的范围。这只是一个**巨大的**怪物 - 你将如何在接下来的2,3,5年内保持这种状态? –
哦,这不是特别的东西。我只是学习数据库,看到网上可以做到这一点,但在其他例子中,我没有看到任何人使用具有3个条件的触发器来更新表格。在他们的例子中,通常是创建一个日志,该代码似乎更简单。 – krikara
'IF EXISTS(SELECT courseID FROM UPDATED)'< - 没有UPDATE表读取。如果您使用SQL Server,则必须从INSERTED或DELETED中获取数据。 – Independent