Oracle入门(十四.19)之触发器简介
一、觸發(fā)器的需求
讓我們從一個例子開始吧:一條業(yè)務規(guī)則規(guī)定,只要員工的工資發(fā)生變化,變更就必須記錄在日志記錄表中。可以創(chuàng)建兩個過程來執(zhí)行此操作:
UPD_EMP_SAL更新工資,LOG_SAL_CHANGE將行插入日志表。可以從UPD_EMP_SAL中調(diào)用LOG_SAL_CHANGE,或者從調(diào)用環(huán)境中分別調(diào)用LOG_SAL_CHANGE。
但不必這樣做。 相反,你創(chuàng)建一個觸發(fā)器。 下一張幻燈片展示了如何。
一個簡單的觸發(fā)器的例子
從現(xiàn)在起,無論何時SQL語句更新薪水,該觸發(fā)器都會自動執(zhí)行,并將該行插入到日志表中。
CREATE OR REPLACE TRIGGER log_sal_change_trigg AFTER UPDATE OF salary ON employees BEGININSERT INTO log_table (user_id, logon_date)VALUES (USER, SYSDATE); END;說觸發(fā)事件(更新工資)發(fā)生時觸發(fā)器會自動觸發(fā)(即執(zhí)行)。 原因和結(jié)果:事件發(fā)生,觸發(fā)器觸發(fā)。二、什么是觸發(fā)器?
(1)數(shù)據(jù)庫觸發(fā)器:?PL / SQL塊是否與特定操作(事件)相關聯(lián),例如用戶成功登錄或?qū)?shù)據(jù)庫對象(如表或視圖)執(zhí)行的操作
?每當發(fā)生相關操作時自動執(zhí)行
?存儲在數(shù)據(jù)庫中在上一張幻燈片的示例中,觸發(fā)器與此操作相關聯(lián):UPDATE OF salary ON employees
(2)應用程序與數(shù)據(jù)庫觸發(fā)器比較
無論何時在架構或數(shù)據(jù)庫中發(fā)生數(shù)據(jù)事件(例如DML或DDL)或系統(tǒng)事件(例如連接用戶或DBA關閉數(shù)據(jù)庫),數(shù)據(jù)庫觸發(fā)器都會自動執(zhí)行。 數(shù)據(jù)庫觸發(fā)器就像PL / SQL過程,函數(shù)和包一樣被創(chuàng)建并存儲在數(shù)據(jù)庫中。 應用程序觸發(fā)器在應用程序中發(fā)生特定事件時自動執(zhí)行。 應用程序觸發(fā)器廣泛用于使用Oracle Forms Developer開發(fā)的應用程序。(3)哪些事件會導致數(shù)據(jù)庫觸發(fā)器觸發(fā)?
數(shù)據(jù)庫中的以下事件可能導致觸發(fā)器觸發(fā):?表上的DML操作
?視圖上的DML操作,帶有INSTEAD OF觸發(fā)器
?DDL語句,例如CREATE和ALTER
?數(shù)據(jù)庫系統(tǒng)事件,例如用戶登錄或DBA關閉數(shù)據(jù)庫時
(4)觸發(fā)器的可能用途
可以使用觸發(fā)器來:
?增強復雜的數(shù)據(jù)庫安全規(guī)則
?自動創(chuàng)建審計記錄
?執(zhí)行復雜的數(shù)據(jù)完整性規(guī)則
?自動創(chuàng)建日志記錄
?防止桌子意外掉落
?防止發(fā)生無效的DML交易
?自動生成派生列值
?維護同步表復制
?收集表訪問統(tǒng)計信息
?在針對視圖發(fā)布DML語句時修改表格數(shù)據(jù)
示例1:自動創(chuàng)建記錄記錄
數(shù)據(jù)庫管理員想要在數(shù)據(jù)庫中保存一個自動記錄(在數(shù)據(jù)庫表中),以及何時登錄。 他/她可以創(chuàng)建日志表和合適的觸發(fā)器,如下所示:
CREATE TABLE log_table (user_id VARCHAR2(30),logon_date DATE); CREATE OR REPLACE TRIGGER logon_trigg AFTER LOGON ON DATABASE BEGININSERT INTO log_table (user_id, logon_date) VALUES (USER, SYSDATE); END;示例2:執(zhí)行復雜的數(shù)據(jù)完整性規(guī)則設想一條規(guī)則,規(guī)定員工的工作不能改變成員工過去已經(jīng)完成的工作。
CREATE OR REPLACE TRIGGER check_sal_trigg BEFORE UPDATE OF job_id ON employees FOR EACH ROW DECLAREv_job_count INTEGER; BEGINSELECT COUNT(*) INTO v_job_countFROM job_historyWHERE employee_id = :OLD.employee_id AND job_id = :NEW.job_id;IF v_job_count > 0 THENRAISE_APPLICATION_ERROR(-20201,'This employee has already done this job');END IF; END;三、觸發(fā)指南
不要將觸發(fā)器定義為復制或替換您可以通過其他方式輕松完成的操作。 例如,使用約束實現(xiàn)簡單的數(shù)據(jù)完整性規(guī)則,而不是觸發(fā)器。過度使用觸發(fā)器會導致復雜的相互依賴關系,這可能難以維護。 僅在必要時使用觸發(fā)器,并注意遞歸和級聯(lián)效應。通過創(chuàng)建在觸發(fā)器主體中調(diào)用的存儲過程或打包過程來避免冗長的觸發(fā)器邏輯。
數(shù)據(jù)庫觸發(fā)器和存儲過程的比較
總結(jié)
以上是生活随笔為你收集整理的Oracle入门(十四.19)之触发器简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “特斯拉高速疯狂别车&rdq
- 下一篇: Oracle入门(十四.21)之创建DM