2016-11-24 46 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