2013-07-18 33 views
0

我需要在一个表中的时间表,以减少一个计数器,当有在入学表中插入:如何创建触发器来减少计数器,触发器有什么问题?

CREATE TRIGGER [UpdateEnrollmentsTrigger] 
ON [TBLENROLLMENT_ENR] 
FOR INSERT 
AS 
BEGIN 
    DECLARE @ScheduleCode NVARCHAR 
    DECLARE @TotalSlots INT 

    IF EXISTS(SELECT SCH_CODE FROM inserted) 
     BEGIN 
      SELECT @ScheduleCode = SCH_CODE FROM inserted 

      SELECT @TotalSlots = SCH_TOTALSLOTS FROM TBLSCHEDULES_SCH 
      WHERE SCH_CODE = @ScheduleCode 

      UPDATE TBLSCHEDULES_SCH 
      SET SCH_FREESLOTS = @TotalSlots - 1 
      WHERE SCH_CODE = @ScheduleCode 
     END 
END 

当我试图创建这个触发器,VS12的查询窗口说:

SQL46010 :: Incorrect syntax near ]. 

提前致谢。

回答

1

具体的错误是因为您使用的是FOR INSERT而不是AFTER INSERT,但还有其他的东西需要改进才能触发。

首先,总是写出NVARCHAR的长度,将其留为空白将取决于使用的位置。因此,用DECLARE @ScheduleCode NVARCHAR(n)代替DECLARE @ScheduleCode NVARCHAR,其中n是所需的长度。

我也不确定你为什么在做IF EXISTS,因为它正在读取INSERTED伪表,因为它触发了触发器,所以它肯定有记录。

另一件需要改进的地方是假设只有一行被插入,因为你将它存储在一个变量中,这是错误的,并且如果插入的不止一行,它将表现不正确。

哦,我差点忘了,你也应该始终指定的模式,例如:CREATE TRIGGER [UpdateEnrollmentsTrigger] ON [TBLENROLLMENT_ENR]应该CREATE TRIGGER dbo.[UpdateEnrollmentsTrigger] ON dbo.[TBLENROLLMENT_ENR](使用正确的模式,当然)

+0

我认为触发器被触发为插入每一行。它是如何工作的? –

+0

@zerazobz它不这样工作。触发器在整个INSERT事务中触发一次。所有在INSERTED伪表上插入的行,所以您需要准备好处理多于一行的行,并假定它是一个具有多行行的表(除非该表上的每个插入操作总是插入一行) – Lamak