【问题标题】:Oracle database: Disabling Trigger updates when a specific column is altered?Oracle数据库:更改特定列时禁用触发器更新?
【发布时间】:2017-04-08 13:46:57
【问题描述】:

我在我的工作场所schema 的人table 上有以下现有trigger

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

【问题讨论】:

    标签: oracle oracle11g triggers schema


    【解决方案1】:

    来自文档: “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;
    

    【讨论】:

    • 谢谢,虽然我每次添加列时都必须更改它?有没有办法只排除“已检查”列?
    • 我不知道。或者,您可以创建一个触发器,在每次更新时触发,并检查每个列更改是否会导致时间戳更新。但是在添加列时您仍然需要更改它。
    【解决方案2】:

    您可以使用简单的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;
    

    【讨论】:

    • 我基本上想要在“已检查”列更改时的功能 - last_updated 列不会被触发器更新。这个答案能解决这个问题吗?
    • 是的,如果您愿意,请制作IF NOT :old.checked <> :new.checked THEN
    • @java123999 但是如果 name 和 checked 在同一个更新语句中都改变了呢?
    • @Rene 我认为这个问题永远不会发生
    • @WernfriedDomscheit 请更新答案以显示这一点,到目前为止我还不明白?谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多