Oracle中的触发器
Oracle中的觸發器
觸發器
觸發器(tigger)是在事件發生時隱式地自動運行的 PL/SQL 程序塊,不能接收參數,不能被調用,就是說某個條件成立的時候,觸發器里面所定義的語句就會被自動的執行。因此觸發器不需要人為的去調用,也不能調用。
觸發器類型
根據觸發器所創建的語句及所影響的對象的不同,將觸發器分為 3 類,DML 觸發器、系統事件觸發器、替代觸發器(instead of 觸發器)。
(1)DML 觸發器
對數據表進行 DML 語句操作(如 insert、update、delete)時所觸發的觸發器,可以分為:語句級觸發器或行級觸發器:行級觸發器會對數據庫表中的受影響的每一行觸發一次觸發器代碼,語句級觸發器則只觸發一次,與語句所影響到的行數無關
before 觸發器或 after 觸發器:before 觸發器在觸發事件發生之前執行觸發器代碼,
after 觸發器則在觸發事件發生之后執行。
語法:
其中:
觸發器名: 觸發器對象的名稱。由于觸發器是數據庫自動執行的,因此該名稱只是一個名稱,沒有實質的用途。
觸發時間: 指明觸發器何時執行,該值可取:
before:表示在數據庫動作之前觸發器執行;
after:表示在數據庫動作之后觸發器執行。
觸發事件: 指明哪些數據庫動作會觸發此觸發器:
insert:數據庫插入會觸發此觸發器;
update:數據庫修改會觸發此觸發器;
delete:數據庫刪除會觸發此觸發器。
**表名:**數據庫觸發器所在的表。
for each row:對表的每一行觸發器執行一次。如果沒有這一選項,則只對整個表執行一次。
觸發器能實現如下功能:
功能:
1、允許/限制對表的修改
2、自動生成派生列,比如自增字段
3、強制數據一致性
4、提供審計和日志記錄
5、防止無效的事務處理
6、啟用復雜的業務邏輯
下面的觸發器在更新表 tb_emp 之前觸發,目的是不允許在周末修改表
create or replace trigger auth_secure before insert or update or DELETE on tb_emp beginIF(to_char(sysdate,'DY')='星期日') THENRAISE_APPLICATION_ERROR(-20600,'不能在周末修改表 tb_emp');END IF; END;--- 插入一條數據以后被觸發 create or replace trigger testTrigger after insert on tb_emp FOR EACH ROW -- 對表的每一行觸發器執行一次declare -- local variables here begin dbms_output.put_line('一個員工被插入'); end testTrigger;---當用戶對 test 表執行 DML 語句時,將相關信息記錄到日志表 --創建測試表 CREATE TABLE test(t_id NUMBER(4),t_name VARCHAR2(20),t_age NUMBER(2),t_sex CHAR );--創建記錄測試表 CREATE TABLE test_log(l_user VARCHAR2(15),l_type VARCHAR2(15),l_date VARCHAR2(30) ); --創建觸發器 CREATE OR REPLACE TRIGGER TEST_TRIGGERAFTER DELETE OR INSERT OR UPDATE ON TEST DECLAREV_TYPE TEST_LOG.L_TYPE%TYPE; BEGINIF INSERTING THEN--INSERT 觸發V_TYPE := 'INSERT';DBMS_OUTPUT.PUT_LINE('記錄已經成功插入,并已記錄到日志');ELSIF UPDATING THEN--UPDATE 觸發V_TYPE := 'UPDATE';DBMS_OUTPUT.PUT_LINE('記錄已經成功更新,并已記錄到日志');ELSIF DELETING THEN--DELETE 觸發V_TYPE := 'DELETE';DBMS_OUTPUT.PUT_LINE('記錄已經成功刪除,并已記錄到日志');END IF;INSERT INTO TEST_LOG VALUES (USER, --USER 表示當前用戶名V_TYPE, TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss')); END;--下面我們來分別執行 DML 語句 INSERT INTO test VALUES(101,'zhao',22,'M'); UPDATE test SET t_age = 30 WHERE t_id = 101; DELETE test WHERE t_id = 101; --然后查看效果 SELECT * FROM test; SELECT * FROM test_log;--- 創建觸發器,比較 emp 表中更新的工資 set serveroutput on; CREATE OR REPLACE TRIGGER SAL_EMPBEFORE UPDATE ON EMPFOR EACH ROW BEGINIF :OLD.SAL > :NEW.SAL THEN --- :old.字段名稱 :原來的值DBMS_OUTPUT.PUT_LINE('工資減少');ELSIF :OLD.SAL < :NEW.SAL THENDBMS_OUTPUT.PUT_LINE('工資增加');ELSEDBMS_OUTPUT.PUT_LINE('工資未作任何變動');END IF;DBMS_OUTPUT.PUT_LINE('更新前工資 :' || :OLD.SAL);DBMS_OUTPUT.PUT_LINE('更新后工資 :' || :NEW.SAL); -- :new.字段名稱: 待更新的值 END; --執行 UPDATE 查看效果 UPDATE emp SET sal = 3000 WHERE empno = '7788';更多相關知識請戳我的主頁哦!
總結
以上是生活随笔為你收集整理的Oracle中的触发器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 雪峰,讨论 - 廖雪峰的官
- 下一篇: Lua pairs与ipairs效率分析