2016-11-09 5 views
1

Чтобы начать, я не парень DB. Просто на этапе обучения. Рассмотрим таблицу с именем Accounts. Он имеет четыре столбца, как указано ниже.Триггер, чтобы узнать, обновлена ​​ли таблица.

--------------------------------------------- 
| 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 | 
--------------------------------------------- 

Мы можем видеть, что данные изменяются в AcType второго ряда к Savings.

Как реализовать триггер, чтобы определить, есть ли изменения (либо, DELETE, UPDATE) в любом из полей таблицы?

+1

сделать триггер на обновление это одно, но то, что это действие ваш триггер предположив делать? –

+0

@ThomasG Trigger должен определить, изменилась ли таблица. – 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; 
Смежные вопросы