使用我在下面显示的触发器会将price
产品更新为折扣。但我希望在以后的插入中,不应更新已应用折扣的记录。
我可以添加什么?
create Trigger tri on t1
after insert As
UPDATE t1
SET price = CASE
WHEN column1 = 'Rebate' THEN price * 0.5
ELSE price
END
答案 0 :(得分:0)
您错过了指示要更新哪一行的位置。例如,查看此查询:
declare @var table (id int)
update Cities
set fullname = 'Melbourne'
output inserted.id into @var
where name = 'MEL'
select * from @var
如果inital update命令使用输出命令,则在触发器中使用@ var.id来限制行。
where t1.id = @var.id
取决于系统的其余部分,您可能需要更多地处理此问题以将ID传递给触发器。
最好是编写一个存储过程来更新表并在那里使用逻辑,节省一些cpu周期和IO。
答案 1 :(得分:0)
尝试在表中使用一个标志列来指示是否应用了回扣..(这不是确切的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
答案 2 :(得分:0)
现在,每次插入内容时,都会在表格中触发 ALL ROWS 更新。
您需要做的是包含Inserted
伪表中的值 - 该表列出实际插入的所有行 - 这样您就可以更新那些(并保留其他任何内容)。
因此,请尝试将触发器更改为以下内容:
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