触发 - 您是否可以根据事务中设置的列有条件地执行?

时间:2013-04-01 22:12:35

标签: oracle triggers oracle11g

如果在update语句中未指定列,那么控制触发器是否仅设置值?例如,如果我在表/列上执行以下更新语句 -

update sampleTable set firstname='test', lastname='me' where id='id1';

在上面的情况下,由于firstname和lastname列都被更新,我不希望在update trigger之前做任何事情。但是,如果执行以下语句 -

update sampleTable set firstname='test' where id='id1';

在上面的情况下,由于lastname列没有更新,我想触发将lastname设置为null。

我试过跟随 -

Create or Replace Trigger testTrigger before update of firstname on sampleTable for each row
begin
   if :old.firstname != :new.firstname and :old.lastname = :new.lastname then
      :new.lastname = null;
   end if;
end;

这背后的想法是,如果我执行上面的第一个更新语句,并且新姓氏与姓氏的前一个值不同,它将具有不同的值:old和:new,因此if条件赢了不满足并且姓氏不会被设置为null。当然我错了,在两个更新语句中,它仍然最终将lastname更新为null。

我有什么选择?我正在使用Oracle 11g。

1 个答案:

答案 0 :(得分:0)

如果您希望lastname设置为null,如果update语句未引用此列,则可以使用UPDATING()函数。

Create or Replace Trigger testTrigger 
before update of firstname on sampleTable 
for each row
begin
   if not updating('LASTNAME') then
      :new.lastname := null;
   end if;
end;
/