【问题标题】:How to create a trigger to decrease a counter, what's wrong with my trigger?如何创建触发器以减少计数器,我的触发器有什么问题?
【发布时间】:2013-07-18 16:13:24
【问题描述】:

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

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 ].

提前致谢。

【问题讨论】:

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


    【解决方案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](当然使用正确的架构)

    【讨论】:

    • 我假设每个插入的行都会触发触发器。它是如何工作的?
    • @zerazobz 那样不行。触发器为整个INSERT 事务触发一次。 INSERTED 伪表上的所有插入行,因此您需要准备好处理不止一行,并假设它是一个包含多行的表(除非该表上的每个插入操作总是插入一行)
    猜你喜欢
    • 2018-03-21
    • 2011-02-15
    • 1970-01-01
    • 2014-12-04
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多