我的工作场所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 已更改。
答案 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;