Oracle入门(十四.20)之创建DML触发器:第一部分
生活随笔
收集整理的這篇文章主要介紹了
Oracle入门(十四.20)之创建DML触发器:第一部分
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、什么是DML觸發器?
DML觸發器是執行SQL DML語句(INSERT,UPDATE或DELETE)時自動觸發(執行)的觸發器。 您可以通過兩種方法對DML觸發器進行分類:?執行時間:BEFORE,AFTER或INSTEAD觸發DML語句。
?它們執行的次數:一次對于整個DML語句(一個語句觸發器),或者對于受DML語句影響的每一行一次(一行
觸發)。
二、創建DML語句觸發器
CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON object_name trigger_body?timing:當觸發器觸發與觸發事件有關時。 值在之前,之后或停止。
?event:哪個DML操作導致觸發器觸發。 值是INSERT,UPDATE [OF列]和DELETE。
?object_name:與觸發器關聯的表或視圖。
?trigger_body:由觸發器執行的操作在匿名塊中定義。
(1)語句觸發時序
觸發器何時應該觸發??BEFORE:在表格上的觸發DML事件之前執行觸發器主體。
?AFTER:在表格上觸發DML事件后執行觸發器主體。
?INSTEAD OF:在視圖上執行觸發器主體而不是觸發DML事件。
編程要求將決定使用哪一個。
(2)觸發時間和事件示例
第一個觸發器在員工的工資更新之前立即執行:
CREATE OR REPLACE TRIGGER sal_upd_trigg BEFORE UPDATE OF salary ON employees BEGIN ... END;員工被刪除后立即執行第二個觸發器:CREATE OR REPLACE TRIGGER emp_del_trigg AFTER DELETE ON employees BEGIN ... END;
可以限制UPDATE觸發器更新特定列或列:
觸發器可能有多個觸發事件:
CREATE OR REPLACE TRIGGER emp_del_trigg AFTER INSERT OR DELETE OR UPDATE ON employees BEGIN ... END;三、怎樣使觸發器觸發?
(1)聲明觸發器:?觸發語句的每次執行僅觸發一次
?是DML觸發器的默認類型
?即使沒有行受到影響,也會觸發一次
CREATE OR REPLACE TRIGGER log_emp_changes AFTER UPDATE ON employees BEGIN INSERT INTO log_emp_table (who, when)VALUES (USER, SYSDATE); END;
現在執行UPDATE語句:
UPDATE employees SET ... WHERE ...;觸發器觸發多少次,如果UPDATE語句修改三行? 十行? 一行?沒有行?(2)觸發器何時觸發
此幻燈片顯示與事件INSERT INTO departments關聯的語句觸發器的觸發順序:INSERT INTO departments(department_id,department_name, location_id) VALUES (400, 'CONSULTING', 2500);
四、觸發器觸發序列
即使觸發的DML語句影響許多行,語句觸發器也只觸發一次:
UPDATE employeesSET salary = salary * 1.1WHERE department_id = 50;(1)DML語句觸發器示例1
每當一行或多行成功插入到EMPLOYEES中時,此語句觸發器就會自動將一行插入到日志記錄表中。
(2)DML語句觸發器示例2
每次在DEPARTMENTS表上成功執行DML操作時,此語句觸發器都會自動向日志記錄表中插入一行。
CREATE OR REPLACE TRIGGER log_dept_changes AFTER INSERT OR UPDATE OR DELETE ON DEPARTMENTS BEGIN INSERT INTO log_dept_table (which_user, when_done)VALUES (USER, SYSDATE); END;(3)DML語句觸發器示例3這個例子展示了如何使用DML觸發器來強制執行復雜的業務規則,這些規則不能被約束強制執行。
希望在正常工作日(星期一至星期五)允許INSERT進入EMPLOYEES表,但在周末(周六和周五)禁止INSERT
星期日)。
如果用戶試圖在周末期間向EMPLOYEES表中插入一行,則用戶將看到錯誤消息,觸發器失敗,并且觸發語句被回滾。以下顯示了此示例所需的觸發器代碼。
用戶嘗試在周末插入一行:
INSERT INTO employees (employee_id, last_name, first_name, email, hire_date, job_id, salary, department_id) VALUES (300, 'Smith', 'Rob', 'RSMITH', SYSDATE,'IT_PROG', 4500, 60); ORA-20500: You may insert into EMPLOYEES table only during business hours. ORA-06512: at “USVA_TEST_SQL01_T01.SECURE_EMP”, line 4 ORA_04088: error during execution of trigger ‘USVA_TEST_SQL01_T01.SECURE_EMP’ 2. VALUES (300, ‘Smith’, ‘Rob’, ‘RSMITH’, SYSDATE, ‘IT_PROG’, 4500, 60);(5)最后一個例子
該觸發器不能成功編譯。 為什么不?
CREATE OR REPLACE TRIGGER log_dept_changes AFTER INSERT OR UPDATE OR DELETE ON DEPARTMENTS BEGIN INSERT INTO log_dept_table (which_user, when_done)VALUES (USER, SYSDATE);COMMIT; END;總結
以上是生活随笔為你收集整理的Oracle入门(十四.20)之创建DML触发器:第一部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《使命召唤:现代战争 2 & 战
- 下一篇: 华为 Watch4 Pro 手表推送鸿蒙