MS SQL触发器而不是更新ELSE可以执行原始查询?

时间:2013-10-02 10:52:37

标签: sql-server

这是我的触发器

Create TRIGGER [dbo].[tri_before_update]
   ON  [dbo].[test]
   instead of update
AS 
BEGIN

 SET NOCOUNT ON;
 if update (test_a)
 begin
  *.. my update & insert query*
 end
END


create TRIGGER [dbo].[tri_before_update_price] 
  ON [dbo].[co_ticket] 
  instead of update 
AS 
BEGIN 
  SET NOCOUNT ON; 
  if update (t_price) 
  begin 
     insert into old_price_log (t_id,insert_time,process_id,old_t_price) 
      select i.t_id,getdate(),2,t_price 
      from Inserted i,co_ticket t where i.t_id = t.t_id 
     update t set t_price = i.t_price 
      from co_ticket t, inserted i 
      where t.t_id = i.t_id 
  end 
  else 
  begin 
    -- if update other then (t_price) then the update comand not execute. 
    -- example when i update t_cancel_flag or t_quantity and etc. end 
  END

当我在列“test_a”上更新时,此触发器执行完美。但是,当我更新“test_a”列之外的其他内容时,它将不会执行。我知道我可以把“else”命令,但我有很多专栏。有时会更新另外两列,有时会更新三列或四列。我不希望每次都更新所有列。是否有可能ELSE“然后执行原始查询”? 我尝试了很多不同的方法,但仍然无法工作。 :(请帮忙!

1 个答案:

答案 0 :(得分:0)

create TRIGGER [dbo].[tri_on_update_price] 
  ON [dbo].[co_ticket] 
AS 
BEGIN 
  SET NOCOUNT ON; 
  if update (t_price) 
  begin 
     insert into old_price_log (t_id,insert_time,process_id,old_t_price) 
      select d.t_id, getutcdate(),2,d.price 
      from deleted d
  END
end

普通的后触发器将完成您想要的操作:如果价格已更新,请插入价格变化的日志。不需要INSTEAD OF。您需要查看deleted pseudo-table以获取旧价格。切勿将当地时间存储在数据库中。