Oracle数据库:在更改特定列时禁用触发器更新?

时间:2016-11-24 10:03:52

标签: oracle oracle11g triggers schema

我的工作场所trigger中的PERSON table上有以下现有schema

目前,当任何其他列被更改时,它会自动将last_updated列更新为当前日期。

触发器:

 CREATE OR REPLACE TRIGGER "WORKPLACE"."UPD_PERSON" 
    BEFORE update ON person 
    FOR each row 
 BEGIN 
    :new.last_updated := systimestamp; 
 END;

当前表:

 ID | Name | Created | last_updated | checked

我的表中有一个名为'checked'的列,如何更改此触发器,以便在更改'checked'列时,last_updated列 NOT 已更改。

2 个答案:

答案 0 :(得分:2)

从文档中: " UPDATE语句可能包含列列表。如果触发语句包含列列表,则仅在更新其中一个指定列时触发触发器"

因此,除了checked之外,为所有列插入列列表。

 CREATE OR REPLACE TRIGGER "WORKPLACE"."UPD_PERSON" 
    BEFORE update of ID , Name , Created ON person 
    FOR each row 
 BEGIN 
    :new.last_updated := systimestamp; 
 END;

答案 1 :(得分:0)

您可以使用简单的IF条件。 “我如何更改此触发器,以便在更改'checked'列时,last_updated列未更改”表示“仅当'checked'列未更改时更新列last_updated “

CREATE OR REPLACE TRIGGER "WORKPLACE"."UPD_PERSON" 
    BEFORE update ON person 
    FOR each row 
BEGIN 
   IF :old.checked = :new.checked THEN
      :new.last_updated := systimestamp; 
   END IF;
END;

注意,如果checked可以为NULL,则还必须验证NULL值,例如

IF :old.checked = :new.checked or (:old.checked IS NULL AND :new.checked IS NULL) THEN

您也可以将条件也放在标题中(注意条件中缺少冒号:

CREATE OR REPLACE TRIGGER "WORKPLACE"."UPD_PERSON" 
    BEFORE update ON person 
    FOR each row 
    WHEN (old.checked = new.checked)
BEGIN 
   :new.last_updated := systimestamp; 
END;