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

Posted

技术标签:

【中文标题】如何使用触发器在 oracle 中创建镜像表?【英文标题】:How to create mirror table in oracle by using triggers? 【发布时间】:2013-12-14 09:07:16 【问题描述】:

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

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" 表中添加了另一个新行,而我想在@987654324 中完成更新时更新现有行@ 表行。同样,如果我删除"Passengers" 表中的一行,如果该行存在于'Passengers_backup' 表中,它也应该被删除。我怎样才能做到这一点?

提前致谢。

【问题讨论】:

乘客表更新时是否要更新乘客表备份? 是的,因为passengers_backup 表的值应该与passengers 表的值相同 如果备份表包含与原始表完全相同的数据,那么备份表有什么意义? @FrankSchmitt,只是我的想法。这可能是客户的某种要求。 【参考方案1】:

为了解决您的问题,您需要为每个操作使用带有相应 SQL 语句的触发器:插入、更新、删除。作为变体,您可以使用类似这样的东西(注意,为了便于阅读,我从您的示例中只留下了两列,因此请根据需要修改您的触发器):

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 上查看此触发器的工作情况。

【讨论】:

以上是关于如何使用触发器在 oracle 中创建镜像表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中创建链接表或镜像表

在 Oracle PL/SQL 中创建触发器时如何解决“编译错误成功”错误?

创建一个监听多个表的全局触发器

请问,在ACCESS中如何创建触发器?

如何在 Oracle 数据库中创建临时表?

Oracle 10g中如何创建表