2016-11-24 224 views
0

我在工作场所schema的PERSON table上有以下triggerOracle数据库:在特定列被更改时禁用触发器更新?

当前,当任何其他列被更改时,它会自动将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 

我有一个名为 '检查' 表中的列,我该怎么改变这个触发器,当“已检查'列被更改,即last_updated列是不是已更改。

回答

2

从文档:

如此。“一个UPDATE语句可能包括列的列表,如果触发语句包括列清单,触发器只有在指定的一列被更新炒鱿鱼”插入除检查以外的所有列的列列表。

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

谢谢,虽然话,我会在每次我添加一列时间这个改变?有没有办法排除'CHECKED'列? – java123999

+0

不是我所知道的。或者,您可以为每次更新创建一个触发器,并检查每个列更改,以便更新您的时间戳。但是在添加列时,您仍然必须改变这一点。 – Rene

0

您可以使用简单的IF条件。 “怎么这么说的时候,‘检查’列被改变,即LAST_UPDATED列没有改变,我可以改变这个触发”“如果‘检查’更新列只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; 
+0

我基本上希望当'checked'列发生变化时 - last_updated列不会被触发器更新。这个答案解决了这个问题吗 – java123999

+0

是的,如果您愿意,可以使用'IF NOT:old.checked <>:new.checked THEN'。 –

+0

@ java123999但是如果name和checked在同一个更新语句中都发生了变化呢? – Rene