【问题标题】:Update rows only the first time in SQL Server仅在 SQL Server 中第一次更新行
【发布时间】:2014-10-23 08:48:50
【问题描述】:

使用我在下面显示的触发器会将产品的price 更新为折扣。但我希望在以后的插入中,不能更新已应用折扣的记录。

我可以添加什么?

create Trigger tri on t1
after insert As
    UPDATE t1
    SET price = CASE 
                   WHEN column1 = 'Rebate' THEN price * 0.5
                                           ELSE price 
                END

【问题讨论】:

  • 如果是AFTER INSERT而不是AFTER UPDATE ,那唱片不就是新的吗?
  • @TimSchmelter 我已将after insert 更改为after update,并且触发器继续更新所有行。
  • @user_012314112 您可以在第一次插入后停止触发器。 disable trigger tri on t1
  • 也许添加一个默认为 0 的位列,当更新设置为 1 并且在触发器上只更新位 = 0 的行。但我猜你应该在插入时进行计算

标签: sql-server triggers sql-update


【解决方案1】:

现在,每次插入任何内容时,您都会在表中触发更新ALL ROWS

您需要做的是包含来自Inserted 伪表的值 - 该表列出了所有实际插入的行 - 这样您就可以更新只是那些 strong>(其他任何内容都保持不变)。

所以试着把你的触发器改成这样:

CREATE TRIGGER tri ON dbo.t1
AFTER INSERT
AS
    UPDATE t1
    SET price = CASE 
                   WHEN column1 = 'Rebate' THEN price * 0.5
                                           ELSE price 
                END
    FROM Inserted i          -- This is the pseudo table with all inserted rows
    WHERE i.ID = t1.ID       -- make a WHERE condition to match rows up, based on some "ID" column

【讨论】:

    【解决方案2】:

    您缺少指示要更新哪一行的位置。例如看这个查询:

    declare @var table (id int)
    update Cities
    set fullname = 'Melbourne'
    output inserted.id into @var 
    where name = 'MEL'
    
    select * from @var
    

    如果您的初始更新命令使用输出命令,那么您在触发器中使用@var.id 来限制行数。

    where t1.id = @var.id
    

    根据您系统的其余部分,您可能需要多做一些工作才能将 id 传递给触发器。

    最好是编写一个存储过程来更新表并在那里有逻辑,节省一些 cpu 周期和 IO。

    【讨论】:

      【解决方案3】:

      尝试在表中设置一个标志列,指示是否应用回扣..(这不是执行更新的确切 sql 查询,您需要添加插入的表来获取数据)

      UPDATE t1
      SET     price=  CASE  WHEN column1='Rebate'   THEN price*0.5
      ELSE price
      END,flag = 'Rebate applied'
      where flag != 'Rebate applied' -- change flag to bit
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        • 2014-07-22
        • 1970-01-01
        相关资源
        最近更新 更多