Oracle入门(十四.19)之触发器简介
一、觸發器的需求
讓我們從一個例子開始吧:一條業務規則規定,只要員工的工資發生變化,變更就必須記錄在日志記錄表中。可以創建兩個過程來執行此操作:
UPD_EMP_SAL更新工資,LOG_SAL_CHANGE將行插入日志表。可以從UPD_EMP_SAL中調用LOG_SAL_CHANGE,或者從調用環境中分別調用LOG_SAL_CHANGE。
但不必這樣做。 相反,你創建一個觸發器。 下一張幻燈片展示了如何。
一個簡單的觸發器的例子
從現在起,無論何時SQL語句更新薪水,該觸發器都會自動執行,并將該行插入到日志表中。
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;說觸發事件(更新工資)發生時觸發器會自動觸發(即執行)。 原因和結果:事件發生,觸發器觸發。二、什么是觸發器?
(1)數據庫觸發器:?PL / SQL塊是否與特定操作(事件)相關聯,例如用戶成功登錄或對數據庫對象(如表或視圖)執行的操作
?每當發生相關操作時自動執行
?存儲在數據庫中在上一張幻燈片的示例中,觸發器與此操作相關聯:UPDATE OF salary ON employees
(2)應用程序與數據庫觸發器比較
無論何時在架構或數據庫中發生數據事件(例如DML或DDL)或系統事件(例如連接用戶或DBA關閉數據庫),數據庫觸發器都會自動執行。 數據庫觸發器就像PL / SQL過程,函數和包一樣被創建并存儲在數據庫中。 應用程序觸發器在應用程序中發生特定事件時自動執行。 應用程序觸發器廣泛用于使用Oracle Forms Developer開發的應用程序。(3)哪些事件會導致數據庫觸發器觸發?
數據庫中的以下事件可能導致觸發器觸發:?表上的DML操作
?視圖上的DML操作,帶有INSTEAD OF觸發器
?DDL語句,例如CREATE和ALTER
?數據庫系統事件,例如用戶登錄或DBA關閉數據庫時
(4)觸發器的可能用途
可以使用觸發器來:
?增強復雜的數據庫安全規則
?自動創建審計記錄
?執行復雜的數據完整性規則
?自動創建日志記錄
?防止桌子意外掉落
?防止發生無效的DML交易
?自動生成派生列值
?維護同步表復制
?收集表訪問統計信息
?在針對視圖發布DML語句時修改表格數據
示例1:自動創建記錄記錄
數據庫管理員想要在數據庫中保存一個自動記錄(在數據庫表中),以及何時登錄。 他/她可以創建日志表和合適的觸發器,如下所示:
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:執行復雜的數據完整性規則設想一條規則,規定員工的工作不能改變成員工過去已經完成的工作。
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;三、觸發指南
不要將觸發器定義為復制或替換您可以通過其他方式輕松完成的操作。 例如,使用約束實現簡單的數據完整性規則,而不是觸發器。過度使用觸發器會導致復雜的相互依賴關系,這可能難以維護。 僅在必要時使用觸發器,并注意遞歸和級聯效應。通過創建在觸發器主體中調用的存儲過程或打包過程來避免冗長的觸發器邏輯。
數據庫觸發器和存儲過程的比較
總結
以上是生活随笔為你收集整理的Oracle入门(十四.19)之触发器简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “特斯拉高速疯狂别车&rdq
- 下一篇: Oracle入门(十四.21)之创建DM