SQL Server 2008 R2:更新后触发

时间:2016-09-12 15:24:23

标签: sql triggers sql-server-2008-r2

这是我的第一篇文章,请耐心等待。以下是我正在使用的表格,我只展示了相关的列:

运动

  id
  cnt_tare_weight
  chassis_tare_weight

停止

  movement_id
  order_id

对于每个移动记录,有2个或更多停止记录。这种方式的作用是我们创建一个订单并创建止损。停靠点分为动作。

以下是一些示例数据:

运动

id       cnt_tare_weight      chassis_tare_weight
-------------------------------------------------
1545257  4525.2                3652.2
1545258  null                  null

停止

order_id     movement_id
------------------------
0933774      1545257
0933774      1545257
0933774      1545258
0933774      1545258

这是我想要完成的事情:

cnt_tare_weight记录中更新chassis_tare_weight和/或movement时,我需要将此数据复制到该订单的所有其他移动记录中。我想在更新后使用触发器来执行此操作。

以下是我提出的建议,但我不确定它是否会奏效。我想看看我想做的事情是否正确,或者我是否遗漏了什么。

这是我的SQL:

CREATE TRIGGER set_tare_weights
ON movement
AFTER UPDATE AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @movement_id AS INT;
    DECLARE @cnt_tare_weight AS DECIMAL(8,1);
    DECLARE @chz_tare_weight AS DECIMAL(8,1); 
    DECLARE @order_id AS int;

    SELECT @movement_id = inserted.id
    FROM INSERTED

    IF update(cnt_tare_weight)
    BEGIN
        SET @cnt_tare_weight = 'Updated cnt_tare_weight'
    END

    IF update(chz_tare_weight)
    BEGIN
        SET @chz_tare_weight = 'Updated chz_tare_weight'
    END

    SELECT @order_id = order_id
    FROM stop 
    WHERE movement_id = @movement_id

    UPDATE movement 
    SET cnt_tare_weight = @cnt_tare_weight, 
        chz_tare_weight = @chz_tare_weight 
    WHERE @movement_id IN (SELECT DISTINCT movement_id 
                           FROM stop 
                           WHERE order_id = @order_id) 
      AND id <> @movement_id
END

之前我从未创建过SQL Server触发器。我不确定这是否有效,或者我是否需要做更多的事情。我是否需要创建一个调用存储过程的触发器?或者上述工作?

感谢您的帮助!

0 个答案:

没有答案