2016-11-09 50 views
1

首先,我不是一個DB人。只是在它的學習階段。我們來看一個名爲Accounts的表格。它有四列,如下所述。觸發查看錶是否更新

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

我們如何確定表中的值是否發生了變化?
(它可以是單一的改變或多個改變)

對於離:

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

我們可以看到,數據在第二行的AcType改變爲Savings

我們如何實現觸發器以確定表中的任何字段是否有變化(INSERT,DELETE,UPDATE)?

+1

做出更新的觸發器是一回事,但你是什麼觸發假設做動作? –

+0

@ThomasG觸發器應該確定表是否已更改。 – intruder

+1

表格更改是觸發觸發器的操作。但是這個觸發器在觸發時必須做些事情,比如把信息寫入表格中... –

回答

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; 

您也可以識別動作

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

如果你是真正的意思是像你需要知道表中的任何改變,你可以這樣做:

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

其中doWhatEverYouNeed是你的程序採取行動的表被修改

後然而,它也會觸發任何更新,即使值不會更改,如果只需要在某些值更改時觸發,您需要使用類似如下的內容:

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;