如何使用触发器在oracle中创建镜像表?

时间:2013-12-14 09:07:17

标签: sql plsql triggers oracle-apex

我创建了一个触发器,如下所示:

create or replace trigger "PASSENGERS_BACKUP_T1"
after
insert or update or delete on "PASSENGERS"
for each row
begin
    if :NEW."P_ID" is  NOT null then 
        INSERT INTO PASSENGERS_BACKUP(
            PB_ID,
            PB_FIRST_NAME,
            PB_LAST_NAME,
            PB_STREET_ADDRESS1,
            PB_STREET_ADDRESS2,
            PB_CITY,
            PB_STATE,
            PB_POSTAL_CODE,
            PB_EMAIL,
            PB_PHONE_NUMBER1,
            PB_PHONE_NUMBER2,
            PB_URL,
            PB_CREDIT_LIMIT,
            PB_TAGS)
        VALUES (
            :new.P_ID,
            :new.P_FIRST_NAME,
            :new.P_LAST_NAME,
            :new.P_STREET_ADDRESS1,
            :new.P_STREET_ADDRESS2,
            :new.P_CITY,
            :new.P_STATE,
            :new.P_POSTAL_CODE,
            :new.P_EMAIL,
            :new.PHONE_NUMBER1,
            :new.PHONE_NUMBER1,
            :new.URL,
            :new.CREDIT_LIMIT,
            :new.TAGS);
    end if;
end;

现在,当我按照上面的触发器更新"passengers"表中的现有行时,在"passengers_backup"表中添加了另一个新行,而我想在更新时更新现有行在"passengers"表行中完成。好吧如果我删除了"Passengers"表中的一行,如果'Passengers_backup'表中存在该行,它也应该被删除。我该如何实现这一目标?

提前致谢。

1 个答案:

答案 0 :(得分:1)

要解决您的问题,您需要为每个操作使用带有相应SQL语句的触发器:insert,update,delete。作为变体,你可以使用这样的东西(注意,为了便于阅读,我只留下你的例子中的两列,所以根据需要修改你的触发器):

create or replace trigger "PASSENGERS_BACKUP_TIUD"
    after insert or update or delete on "PASSENGER"
for each row
begin
    if inserting then
          insert into "PASSENGER_BACKUP" (pb_id, pb_first_name)
          values (:NEW.pb_id, :NEW.pb_first_name);
    elsif updating then
          update "PASSENGER_BACKUP"
          set pb_id=:NEW.pb_id, pb_first_name=:NEW.pb_first_name
          where pb_id=:NEW.pb_id;
    elsif deleting then
          delete from "PASSENGER_BACKUP"
          where pb_id=:OLD.pb_id;
    end if;
end;

此外,您可以在SQL Fiddle上查看此触发器的工作情况。