oracle 觸發器,當一個表更新或插入時將資料同步至另個庫中的某個表中

sayesan發表於2018-05-09

有兩個表分別是 A使用者下的 T_SRC_WEATHER_TSPG欄位如圖,

B使用者下的t_src_weather 表,如圖:

要求,當A使用者下的T_SRC_WEATHER_TSPG表有插入或者更新資料時,同時將資料同步至B使用者下的t_src_weather表中,

建立觸發器,sql語句如下:

  CREATE OR REPLACE TRIGGER weather_history_update  -- weather_history_update為觸發器名稱
     AFTER update or insert on  Yjzhaccess.T_SRC_WEATHER_TSPG  --AFTER 指定 觸發時間,on後跟表名稱,即當表Yjzhaccess.T_SRC_WEATHER_TSPG有更新或者插入時觸發時間
     for each row                                                                                                     --每一行
     begin                                                                                           
     insert into yjzhhistory.t_src_weather (ID,SSXQMC,SSXQDM,HISTIME,WEATHER)  --指定插入的表及欄位
    VALUES(:new.ID,:new.MC,:new.ID,:new.gxsj,:new.type);                                          --將新插入的資料引入到該表中
    end;

 執行完後執行 INSERT INTO Yjzhaccess.T_SRC_WEATHER_TSPG  values(23,'二十三大隊',66.66,16.66,'雪',66,sysdate)出現異常,報ora-04098:觸發器無效且未通過重新驗證通過plsql developer進入該觸發器發現編譯錯誤:

發現錯誤為沒有許可權,登入dba使用者將 B使用者下的該表的插入許可權賦給A使用者 sql為:grant insert on yjzhhistory.t_src_weather  to yjzhaccess

賦予許可權後再執行測試更新語句,成功,此時觸發器執行觸發事件,兩個表中都有了對應的資料





例子:create or replace trigger InsertAISyn
after update ON REQ_PROC
   FOR EACH ROW
DECLARE
OLDSTATUS VARCHAR2(64);
NEWSTATUS VARCHAR2(64);
STUDYUID  VARCHAR2(64);
STUDYID  VARCHAR2(64);
PATIENTID  VARCHAR2(64);
Modality  VARCHAR2(64);
StudyDesc  VARCHAR2(64);
BEGIN
NEWSTATUS :=:new.STATUS;
OLDSTATUS := :old.STATUS;
STUDYUID:=:new.STUDY_INS_UID;
Modality:=:new.MODALITY;
STUDYID:=:new.REQ_PROC_ID;
StudyDesc:=:new.PARTOFCHECK;


IF NEWSTATUS ='已檢查' AND OLDSTATUS<>NEWSTATUS then
BEGIN
     delete hhpacs.synaistaus where STUDYUID= STUDYUID;
if(Modality = 'CT') then
   BEGIN
    insert into hhpacs.SynAIStaus(STUDYUID,STUDYID,PATIENTID,Modality,StudyDesc,SynStatus)
values(STUDYUID,STUDYID,PATIENTID,Modality,StudyDesc,0);
   END;
    end if;
END;
end if;
END;

相關文章