2016-11-09 68 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;