Oracle 修改 新增 觸發器 針對字段修改 觸發器 誤刪Oracle表、數據、觸發器找回 閃回查詢


emmmm 寫這個博客心情很復雜,,,本來這個觸發器早就寫好了,后來發生點事就寫個博客當個備份吧,就當留紀念了;話不多數上問題以及SQL:

 

問題:

  

  1. 在ABONPB表上增加一個觸發器,針對車牌號字段做update操作且new:傳入的mduser字段為API,status為P時,向PA_BANK_REGNO_RECORD表中insert 一條記錄,sync字段為0,修改次數為之前的次數加1,其余字段參考字段意義。(YC)
  2. 當insert進ABONPB時新案件時,同理lla_code為MA  為條件也要觸發上班觸發器,計數加一(后來添加)

 更新:提交一個閃回查詢找誤刪數據的SQL,類似的網上還有很多就不一一舉例了;;;;;

  閃回查詢::

select * from dba_source a where a.type='TRIGGER';
SELECT * from dba_source a where a.name LIKE  '%ABONPB_%';



SELECT NAME, TEXT
      FROM DBA_SOURCE AS OF TIMESTAMP TO_TIMESTAMP('2018-06-05 12:20:00', 'yyyy-mm-dd hh24:mi:ss')
      WHERE OWNER = 'ACSPRD'
      AND TYPE = 'PROCEDURE'
      AND NAME LIKE  '%ABONPB_UPDATE%';

 

 

觸發器解決:

 

CREATE OR REPLACE TRIGGER ABONPB_UPDATE_20180615
  BEFORE UPDATE OR INSERT ON ABONPB_20180615
  FOR EACH ROW
DECLARE
  IXEST             INTEGER;
  CHAGE             INTEGER;
  IXEST2             INTEGER;
  CHAGE2             INTEGER;
BEGIN
  IF updating('regnr') AND :OLD.MDUSR = 'API' AND :OLD.STATUS = 'P'AND :old.Regnr != :new.Regnr THEN
    SELECT COUNT(1) INTO IXEST FROM EMAPIII.PA_BANK_REGNO_RECORD T WHERE T.IDCARD_NO = :OLD.POLICYNR AND T.CARD_NO = :OLD.VIN AND  T.LASTNAME = :OLD.LASTNAME;
    IF IXEST = 0  THEN
      INSERT INTO EMAPIII.PA_BANK_REGNO_RECORD
        (ID,
         IDCARD_NO,
         CARD_NO,
         LASTNAME,
         REGNO,
         CHANGE_TIMES,
         CHANGE_TIME,
         CONTRACTCODE,
         SERIE,
         SYNC,
         ACCTNO)
      VALUES
        (EMAPIII.PA_BANK_REGNO_RECORD_SEQ.NEXTVAL,
         :NEW.VIN,
         :NEW.POLICYNR,
         :NEW.LASTNAME,
         :NEW.REGNR,
         0,
         SYSDATE,
         :NEW.LCO_LNA_CODE,
         :NEW.SERIE,
         0,
         :NEW.SUBNUMBER);

    ELSE
      SELECT T.CHANGE_TIMES INTO CHAGE FROM EMAPIII.PA_BANK_REGNO_RECORD T WHERE T.IDCARD_NO = :OLD.POLICYNR AND T.CARD_NO = :OLD.VIN  AND T.LASTNAME = :OLD.LASTNAME;

      UPDATE EMAPIII.PA_BANK_REGNO_RECORD
         SET REGNO =:new.Regnr, CHANGE_TIMES = CHAGE+1 , CHANGE_TIME = SYSDATE
       WHERE IDCARD_NO = :OLD.POLICYNR
         AND CARD_NO = :OLD.VIN
         AND LASTNAME = :OLD.LASTNAME;

    END IF;
    
  END IF;
  IF  :new.Lla_Code='MA'THEN 
     SELECT COUNT(1) INTO IXEST2 FROM EMAPIII.PA_BANK_REGNO_RECORD T WHERE T.IDCARD_NO = :new.POLICYNR AND T.CARD_NO = :new.VIN AND  T.LASTNAME = :new.LASTNAME;
    IF IXEST2 = 0  THEN
      INSERT INTO EMAPIII.PA_BANK_REGNO_RECORD
        (ID,
         IDCARD_NO,
         CARD_NO,
         LASTNAME,
         REGNO,
         CHANGE_TIMES,
         CHANGE_TIME,
         CONTRACTCODE,
         SERIE,
         SYNC,
         ACCTNO)
      VALUES
        (EMAPIII.PA_BANK_REGNO_RECORD_SEQ.NEXTVAL,
         :NEW.VIN,
         :NEW.POLICYNR,
         :NEW.LASTNAME,
         :NEW.REGNR,
         0,
         SYSDATE,
         :NEW.LCO_LNA_CODE,
         :NEW.SERIE,
         0,
         :NEW.SUBNUMBER);

    ELSE
      SELECT T.CHANGE_TIMES INTO CHAGE2 FROM EMAPIII.PA_BANK_REGNO_RECORD T WHERE T.IDCARD_NO = :new.POLICYNR AND T.CARD_NO = :new.VIN  AND T.LASTNAME = :new.LASTNAME;

      UPDATE EMAPIII.PA_BANK_REGNO_RECORD
         SET REGNO =:new.Regnr, CHANGE_TIMES = CHAGE2+1 , CHANGE_TIME = SYSDATE
       WHERE IDCARD_NO = :new.POLICYNR
         AND CARD_NO = :new.VIN
         AND LASTNAME = :new.LASTNAME;

    END IF;
  
    END IF;
END;

 

ps:最后的最后一定要注意!!!!!!刪除表時一定要備份該表的觸發器、索引等,,,,,說多了都是淚啊!!!!!再然后,誤刪了沒備份可以試試Oracle的閃回查詢,運氣好的話可以找回,,,

 

以上!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM