更新時間:2021-02-25 17:37:58 來源:動力節(jié)點 瀏覽1857次
觸發(fā)器的定義就是說某個條件成立的時候,觸發(fā)器里面所定義的語句就會被自動的執(zhí)行。因此觸發(fā)器不需要人為的去調用,也不能調用。然后,觸發(fā)器的觸發(fā)條件其實在你定義的時候就已經(jīng)設定好了。本文我們就來通過實例解析Oracle觸發(fā)器。
我們先來看一下Oracle觸發(fā)器的基本語法:
create [or replace] tigger 觸發(fā)器名 觸發(fā)時間 觸發(fā)事件
on 表名
????[for each row]
begin
????pl/sql語句
End
下面我們來介紹觸發(fā)器每個部分的定義:
觸發(fā)器名:觸發(fā)器對象的名稱。由于觸發(fā)器是數(shù)據(jù)庫自動執(zhí)行的,因此該名稱只是一個名稱,沒有實質的用途
觸發(fā)時間:指明觸發(fā)器何時執(zhí)行,該值可取
before:表示在數(shù)據(jù)庫動作之前觸發(fā)器執(zhí)行
after:表示在數(shù)據(jù)庫動作之后觸發(fā)器執(zhí)行
觸發(fā)事件:指明哪些數(shù)據(jù)庫動作會觸發(fā)此觸發(fā)器
insert:數(shù)據(jù)庫插入會觸發(fā)此觸發(fā)器
update:數(shù)據(jù)庫修改會觸發(fā)此觸發(fā)器
delete:數(shù)據(jù)庫刪除會觸發(fā)此觸發(fā)器
表 名:數(shù)據(jù)庫觸發(fā)器所在的表
for each row:對表的每一行觸發(fā)器執(zhí)行一次。如果沒有這一選項,則只對整個表執(zhí)行一次。
通過上面的Oracle觸發(fā)器的基本語法,我們下面給出幾個具體的Oracle觸發(fā)器實例:
1、下面的觸發(fā)器在更新表tb_emp之前觸發(fā),目的是不允許在周末修改表:
create or replace trigger auth_secure before insert or update or DELETE
on tb_emp
begin
??IF(to_char(sysdate,'DY')='星期日') THEN
????RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表tb_emp');
??END IF;
END;
2、使用觸發(fā)器實現(xiàn)序號自增
創(chuàng)建一個測試表:
create table tab_user(
??id number(11) primary key,
??username varchar(50),
??password varchar(50)
);
創(chuàng)建一個序列:
create sequence my_seq increment by 1 start with 1 nomaxvalue nocycle cache 20;
創(chuàng)建一個觸發(fā)器:
CREATE OR REPLACE TRIGGER MY_TGR
?BEFORE INSERT ON TAB_USER
?FOR EACH ROW--對表的每一行觸發(fā)器執(zhí)行一次
DECLARE
?NEXT_ID NUMBER;
BEGIN
?SELECT MY_SEQ.NEXTVAL INTO NEXT_ID FROM DUAL;
?:NEW.ID := NEXT_ID; --:NEW表示新插入的那條記錄
END;
向表插入數(shù)據(jù):
insert into tab_user(username,password) values('admin','admin');
insert into tab_user(username,password) values('fgz','fgz');
insert into tab_user(username,password) values('test','test');
COMMIT;
查詢表結果:
SELECT * FROM TAB_USER;
3、當用戶對test表執(zhí)行DML語句時,將相關信息記錄到日志表
--創(chuàng)建測試表
CREATE TABLE test(
??t_id ?NUMBER(4),
??t_name VARCHAR2(20),
??t_age NUMBER(2),
??t_sex CHAR
);
--創(chuàng)建記錄測試表
CREATE TABLE test_log(
??l_user ?VARCHAR2(15),
??l_type ?VARCHAR2(15),
??l_date ?VARCHAR2(30)
);
創(chuàng)建觸發(fā)器:
--創(chuàng)建觸發(fā)器
CREATE OR REPLACE TRIGGER TEST_TRIGGER
?AFTER DELETE OR INSERT OR UPDATE ON TEST
DECLARE
?V_TYPE TEST_LOG.L_TYPE%TYPE;
BEGIN
?IF INSERTING THEN
??--INSERT觸發(fā)
??V_TYPE := 'INSERT';
??DBMS_OUTPUT.PUT_LINE('記錄已經(jīng)成功插入,并已記錄到日志');
?ELSIF UPDATING THEN
??--UPDATE觸發(fā)
??V_TYPE := 'UPDATE';
??DBMS_OUTPUT.PUT_LINE('記錄已經(jīng)成功更新,并已記錄到日志');
?ELSIF DELETING THEN
??--DELETE觸發(fā)
??V_TYPE := 'DELETE';
??DBMS_OUTPUT.PUT_LINE('記錄已經(jīng)成功刪除,并已記錄到日志');
?END IF;
?INSERT INTO TEST_LOG
?VALUES
??(USER, V_TYPE, TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss')); --USER表示當前用戶名
END;
/
--下面我們來分別執(zhí)行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;
上述的三個Oracle觸發(fā)器的實例能夠幫助我們掌握Oracle觸發(fā)器的基本用法,我們想要深入學習Oracle觸發(fā)器的小伙伴可以觀看本站的Oracle教程,學習各種Oracle相關的知識點,提升自己對Oracle知識體系的掌握能力。