Oracle數據庫創建DML觸發器


觸發器的基本分類

1.行觸發器:數據庫表中的每一行有變化都會觸發一次觸發器代碼

2.語句觸發器:與語句所影響的行數無關,僅觸發一次

3.BEFORE觸發器:在DML語句執行之前觸發

4.ALFTER觸發器:在DML語句執行之后觸發

 

DML觸發器基本定義:

  CREATE  [OR REPLACE] TRIGGER  [schema.] trigger

  {BEFORE|AFTER}  verb_list ON [schema.]table

  [FOR EACH ROW]

  [WHEN (condition)]

  BEGIN

    .................

  END;

 

      創建一個行級觸發器如下:

CREATE OR REPLACE TRIGGER TRIG_R_WIP_TRACKING_T
   BEFORE UPDATE OR INSERT OR DELETE
   ON SFCRUNTIME.R_WIP_TRACKING_T
   FOR EACH ROW
BEGIN
   IF INSERTING
   THEN
      INSERT INTO SFCRUNTIME.R_WO_BASE (ID,
                                        WORKORDERNO,
                                        WO_TYPE,
                                        SKUNO,
                                        SKU_VER,
                                        SKU_NAME,
                                        SKU_DESC)
           VALUES ('002',
                   :new.mo_number,
                   'normal',
                   :new.model_name,
                   :new.version_code,
                   :new.model_name,
                   :new.model_name);
   ELSIF UPDATING
   THEN
      UPDATE R_WO_BASE
         SET PLANT = :new.serial_number
       WHERE WORKORDERNO = :new.mo_number;
   ELSIF DELETING
   THEN
      DELETE FROM R_WO_BASE
            WHERE WORKORDERNO = :old.mo_number;
   END IF;
END;

 注:執行上述觸發器會報錯--->[Error] ORA-01031 (10: 30): PL/SQL: ORA-01031: insufficient privileges

 原因及解決:我登陸數據庫用的是SYSTEM,而建立的觸發器是基於SFCRUNTIME賬戶下的表,故會報無權限的錯誤

                       解決->創建觸發器時觸發器的名字前面也加上用戶名前綴

最終正確觸發器如下

CREATE OR REPLACE TRIGGER SFCRUNTIME.TRIG_R_WIP_TRACKING_T
   BEFORE UPDATE OR INSERT OR DELETE
   ON SFCRUNTIME.R_WIP_TRACKING_T
   FOR EACH ROW
BEGIN
   IF INSERTING
   THEN
      INSERT INTO SFCRUNTIME.R_WO_BASE (ID,
                                        WORKORDERNO,
                                        WO_TYPE,
                                        SKUNO,
                                        SKU_VER,
                                        SKU_NAME,
                                        SKU_DESC)
           VALUES ('002',
                   :new.mo_number,
                   'normal',
                   :new.model_name,
                   :new.version_code,
                   :new.model_name,
                   :new.model_name);
   ELSIF UPDATING
   THEN
      UPDATE R_WO_BASE
         SET PLANT = :new.serial_number
       WHERE WORKORDERNO = :new.mo_number;
   ELSIF DELETING
   THEN
      DELETE FROM R_WO_BASE
            WHERE WORKORDERNO = :old.mo_number;
   END IF;
END;

 

關於OLD和NEW謂詞的幾點說明

1.只有行觸發器才可以使用OLD NEW謂詞來獲取語句執行前和執行后的記錄

2.當在INSET語句上激發觸發器時,OLD結構不包含任何值

3.UPDATE語句激發觸發器,OLD結構包含之前舊的記錄的值 NEW包含更新后的值

4.DELETE語句激發觸發器,NEW不包含任何值,OLD包含已經被刪除的值


免責聲明!

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



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