2016-11-24 10 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ステートメントは、列のリストを含めることができますトリガ文が列リストが含まれている場合、トリガーは指定された列の1つが更新されたときにのみ起動されます。」

ので、チェックされていないすべての列の列リストを挿入します。

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の条件を使用できます。が

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; 
「『確認』列が変更されていない場合、更新列のみlast_updatedです」という意味「『確認』欄は、LAST_UPDATED列が変更されていないことを、変更されたときにように、私はこのトリガーを変更する方法」

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

私は基本的に 'チェック'列が変更されたときにlast_updated列がトリガーによって更新されないという機能を必要としています。この答えはこれを解決しますか? – java123999

+0

はい、好きな場合は 'IF NOT:old.checked <>:new.checked THEN'とします。 –

+0

@ java123999しかし、同じ更新文でnameとcheckedの両方が変更された場合はどうなりますか? – Rene

関連する問題