触发以查看表是否已更新

时间:2016-11-09 19:24:23

标签: sql oracle triggers

首先,我不是数据库人。刚刚进入学习阶段。我们考虑一个名为 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

我们如何实施触发器以确定表格的任何字段中是否存在更改({1}},INSERTDELETE)?

2 个答案:

答案 0 :(得分: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;

答案 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;