觸發器的基本分類
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包含已經被刪除的值
