2016-11-09 3 views
1

私はDBの人ではありません。ちょうどその学習段階です。テーブルAccountsを考えてみましょう。以下に述べるように、4つの列があります。テーブルが更新されているかどうかを確認するためのトリガー

--------------------------------------------- 
| PK | AcType | FName | LName | Zip | 
--------------------------------------------- 
| 1 | Savings | AAA | ZZZ | 11111 | 
| 2 | Checking | BBB | YYY | 22222 | 
| 3 | Checking | CCC | XXX | 33333 | 
--------------------------------------------- 

テーブルで値が変更されているかどうかを確認するにはどうすればよいですか?
(これは、単一の変更または複数の変更であってもよい)EXについて

--------------------------------------------- 
| PK | AcType | FName | LName | Zip | 
--------------------------------------------- 
| 1 | Savings | AAA | ZZZ | 11111 | 
| 2 | Savings | BBB | YYY | 22222 | 
| 3 | Checking | CCC | XXX | 33333 | 
--------------------------------------------- 

我々は、そのデータがSavingsに2行目のAcTypeに変更さ見ることができます。

表のどのフィールドにも変更(INSERT,DELETEUPDATEのいずれか)があるかどうかを判断するためにトリガーを実装するにはどうすればよいですか?

+1

更新のトリガは一つのことですが、あなたのトリガーを行うことを想定しているアクションが何であることを確認し認識することができ

CREATE or REPLACE TRIGGER AccountsChanged AFTER INSERT OR DELETE OR UPDATE ON Accounts BEGIN insert into change_log_table(change_time, what_changed, change_status) values (sysdate, 'Accounts', 'TRUE') END; 
? –

+0

@ThomasG Triggerは、テーブルが変更されたかどうかを判断します。 – intruder

+1

テーブルの変更は、トリガをトリガするアクションです。しかし、そのトリガは、トリガするときに、テーブルの情報を書くような何かをしなければならない... –

答えて

1

あなたはまた、アクション

CREATE or REPLACE TRIGGER AccountsChanged 
    AFTER INSERT OR DELETE OR UPDATE ON Accounts 
    DECLARE 
    action_type varchar2(1); 
    BEGIN 
     if inserting then action_type := 'I' end if; 
     if updating then action_type := 'U' end if; 
     if deleting then action_type := 'D' end if; 
     insert into change_log_table(change_time, what_changed, change_status, action_type) 
      values (sysdate, 'Accounts', 'TRUE', action_type) 
    END; 
1

あなたは本当にあなたがテーブルの変更を知っている必要がありますように、あなたがこれを行うことができ、それを意味しなかった場合:

doWhatEverYouNeedはテーブルが

を変更された後に行動を取るあなたの手順で

CREATE or REPLACE TRIGGER AccountsChanged 
AFTER INSERT OR DELETE OR UPDATE ON Accounts 
BEGIN 
    doWhatEverYouNeed; 
END; 

ただし、値が変更されていなくても、値が変更されていなくても更新が発生すると 何らかの値が変更された場合にのみトリガーする必要がある場合は、次のようにする必要があります:

CREATE or REPLACE TRIGGER AccountsChanged 
AFTER INSERT OR DELETE OR UPDATE ON Accounts 
FOR EACH ROW 
BEGIN 
    if updating 
    then 
     IF :NEW.AcType <> :OLD.AcType or :NEW.FName <> :OLD.FName or :NEW.LName <> :OLD.LName or :NEW.Zip <> :OLD.Zip 
     then 
      doWhatEverYouNeed; 
     end if; 
    else 
     doWhatEverYouNeed; 
    end if; 

END; 
関連する問題