2012-12-06 118 views
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

+1

非常诚实:我建议有**三个单独的**触发器 - 这很容易处理,如果需要可以禁用INSERT触发器,并且每个触发器中的代码量恰好在一个可管理的范围。这只是一个**巨大的**怪物 - 你将如何在接下来的2,3,5年内保持这种状态? –

+0

哦,这不是特别的东西。我只是学习数据库,看到网上可以做到这一点,但在其他例子中,我没有看到任何人使用具有3个条件的触发器来更新表格。在他们的例子中,通常是创建一个日志,该代码似乎更简单。 – krikara

+0

'IF EXISTS(SELECT courseID FROM UPDATED)'< - 没有UPDATE表读取。如果您使用SQL Server,则必须从INSERTED或DELETED中获取数据。 – Independent

回答

0

与触发器的一些问题如:

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

  2. 第二个是,经过 IF EXISTS(---condition---)必须使用BEGINENDTHENEND。 这也是您可能在该查询中多次遇到的语法错误。

希望这对你有所帮助。