2013-12-14 39 views
0

我創建了一個觸發如下:如何使用觸發器在oracle中創建鏡像表?

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'表中,它也應該被刪除。我該如何實現這個目標?

在此先感謝。

+0

當乘客更新時,是否要更新tables passengers_backup? –

+0

是的,因爲passengers_backup表應該與乘客表具有相同的值 – xyz9999

+0

如果備份表包含與原始表完全相同的數據,有什麼意義? –

回答

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