日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle入门(十四.19)之触发器简介

發(fā)布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle入门(十四.19)之触发器简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、觸發(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。