带插入,更新,删除的SQL Server触发器

时间:2012-12-06 04:19:27

标签: sql-server triggers

以前,我为插入,更新和删除操作分别创建了3个触发器。

当其中一个发生时,触发器应该修改另一个表中的值。

当我尝试为所有3个动作(插入,更新和删除)创建一个组合触发器时,我在尝试执行它时会遇到很多错误。我已经尝试了case语句和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。不确定这是否正确。

我得到的错误是:

  

关键字'THEN'附近的语法不正确。

我也是ELSE

1 个答案:

答案 0 :(得分:0)

触发器的一些问题如下:

  1. 没有任何更新的表,已使用第一个条件检查的更新案例。 即(删除和插入)的情况。

  2. 第二个就是之后 IF EXISTS(---condition---)必须使用 BEGINEND而不是THENEND。 这也是您在该查询中可能多次遇到的语法错误。

  3. 希望这有助于你。