【问题标题】:SQL Server 2012 multiple triggersSQL Server 2012 多个触发器
【发布时间】:2014-01-24 23:30:45
【问题描述】:

嗯,在 SQL Server 2012 中,我有一个表来跟踪......嗯,项目......的容量

基本上Storage表有CapacityFilled列,Filled列每次Item表有变化都需要更新,但不能高于@987654326 @ 值或低于“0”。我试图把它全部放在一个触发器中......我希望到目前为止我有任何意义......这就是我试图做的,我认为只有在 INSERT 发生时才会激活触发器......

ALTER TRIGGER [dbo].[CapCheck]
ON [dbo].[Item]
AFTER INSERT, DELETE, UPDATE
AS
BEGIN
DECLARE @Amount int
DECLARE @S_ID int

SELECT  @Amount = Amount, @S_ID = S_ID
FROM inserted

IF @Amount = NULL
BEGIN
     SELECT @Amount = -(Amount), @S_ID = S_ID
     FROM deleted
END

DECLARE @Filled int
DECLARE @Capacity int

SELECT @Filled = Filled, @Capacity = Capacity 
FROM Storage
WHERE S_ID = @S_ID

SET @Filled = @Filled + @Amount

IF @Capcaity < @Filled OR @Filled < 0
BEGIN
    ROLLBACK TRANSACTION
END
ELSE
BEGIN
    UPDATE Storage
    SET Filled = @Filled
    WHERE S_ID = @S_ID
END
END

非常感谢任何建议,你们是最好的:D

【问题讨论】:

    标签: sql triggers sql-update sql-server-2012


    【解决方案1】:

    您的根本缺陷是您似乎希望触发器每行触发一次 - 这在 SQL Server 中不是。相反,触发器每条语句触发一次,伪表Inserted 可能包含多行

    鉴于该表可能包含多行 - 您希望此处选择哪一行??

    SELECT  @Amount = Amount, @S_ID = S_ID
    FROM inserted    
    

    它是未定义的 - 您可以从Inserted 中的任意行获取值。

    您需要重写整个触发器,知道Inserted 包含多行!您需要使用基于集合的操作 - 不要期望 Inserted 中只有一行!

    另外:我强烈建议为每个操作编写单独的触发器 - 为INSERT 设置一个触发器,为DELETE 设置另一个触发器,为UPDATE 设置第三个触发器。这将使触发代码更容易(因为您不必对您正在处理的操作类型进行多次检查)。

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多