如何创建一个减少计数器的触发器,我的触发器出了什么问题?

时间:2013-07-18 16:13:25

标签: sql sql-server tsql visual-studio-2012 triggers

当注册表中有插入时,我需要减少表计划中的计数器:

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 个答案:

答案 0 :(得分:1)

具体错误是因为您使用的是FOR INSERT而不是AFTER INSERT,但还有其他一些因素需要改进。

首先,始终始终写出NVARCHAR的长度,将其留空将根据其使用位置的不同而有所不同。因此,将DECLARE @ScheduleCode NVARCHAR替换为DECLARE @ScheduleCode NVARCHAR(n),其中n是所需的长度。

我也不确定你为什么要这样做IF EXISTS,因为它正在读取INSERTED伪表,因为触发器已被触发,它必然会有记录。

要改进的另一件事是你假设只插入了一行,因为你将它存储在一个变量上,这是错误的,如果你插入的不仅仅是一行,它将表现不正确。

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