一、涉及內容
1.理解觸發器的概念、作用和類型。
2.練習觸發器的創建和使用。
二、具體操作
(實驗)
1.利用觸發器對在scott.emp表上執行的DML操作進行安全性檢查,只有scott用戶登錄數據庫后才能向該表中執行DML操作。(第1題中,user是系統函數,返回當前用戶。字符串中使用兩個單引號表示一個單引號。)
要求:分別以system用戶和scott用戶對emp 表執行DML操作,試驗觸發器的運行效果。
(1)在scott用戶下創建觸發器
語句:
create or replace trigger tri_dm1 before insert or update or delete on scott.emp begin if user <>'SCOTT' then raise_application_error(-20001,'You don''t have access to modify this table.'); end if; end; /
截圖:
(2)以system 用戶連接,並對emp表執行DML操作
語句:
conn system/orcl1234; insert into scott.emp(empno,ename) values(8888,'shenxiao');
截圖:
(3)以scott用戶連接,並對emp表執行DML操作
語句:
conn scott/tiger; insert into scott.emp(empno,ename) values(8888,'shenxiao');
截圖:
2.利用觸發器進行表和備份表之間的同步復制。
(1)在scott 用戶下創建scott.emp 表的復本 employee。
語句:
conn scott/tiger;
create table employee as select * from scott.emp;
截圖:
(2)在scott用戶下創建能實現scott.emp和employee 兩表之間同步復制的DML觸發器。
語句:
create or replace trigger duplicate_emp after update or insert or delete on scott.emp for each row begin if inserting then insert into employee values (:new.empno,:new.ename,:new.job,:new.mgr, :new.hiredate,:new.sal,:new.comm,:new.deptno); elsif deleting then delete from employee where empno=:old.empno; else update employee set empno=:new.empno,ename=:new.ename,job=:new.job, mgr=:new.mgr,hiredate=:new.hiredate,sal=:new.sal,comm=:new.comm, deptno=:new.deptno where empno=:old.empno; end if; end; /
截圖:
(3)對scott.emp表進行插入、刪除和更新操作。
刪除:delete from scott.emp where empno=7934;
插入:
Insert into scott.emp(empno,ename,job,sal) values(1111,'zhangsan','ANALYST',2900)
更新:
update scott.emp set sal=3900 where empno=1111;
(4)查詢scott.emp表和employee表中插入、刪除和更新的記錄。
語句:select * from scott.emp;
select * from employee;
截圖:
3.建立觸發器,對scott.emp 表進行DML操作時的時間、用戶進行日志記錄。
(1)建立日志表emp_log。
語句:create table emp_log(who varchar2(30),when date,oper varchar2(10));
截圖:
(2)在emp表上建立語句級觸發器,將對emp表執行的操作記錄到emp_log表中。
語句:
create or replace trigger dm1_log after insert or update or delete on scott.emp declare oper emp_log.oper%type; begin if inserting then oper:='insert'; elsif deleting then oper:='delete'; else oper:='update'; end if; insert into emp_log values(user,sysdate,oper); end; /
截圖:
(3)對scott.emp 執行DML操作,查看emp_log 表中的數據。
語句:
insert into scott.emp(empno) values(1112); select * from emp_log;
截圖:
(習題)
1.簡述Oracle 數據庫中觸發器的類型及觸發條件。
答:觸發器的類型及觸發條件如下表所示:
按划分類型 |
觸發器的類型 |
觸發條件 |
按照觸發的時間 |
BEFORE觸發器,指事前觸發器 |
在觸發語句執行前觸發器被觸發
|
AFTER觸發器,指事后觸發器 |
在觸發語句執行以后觸發器被觸發 |
|
INSTEAD OF觸發器,指替代觸發器 |
觸發語句被觸發器操作替代 |
|
按照觸發的事件 |
DML觸發器 |
對表或視圖執行DML操作時觸發的觸發器 |
DDL觸發器 |
在數據庫中執行DDL操作時觸發的觸發器 |
|
用戶事件觸發器 |
與用戶執行的DCL操作或LOGON/LOGOFF操作相關的觸發器 |
|
系統事件觸發器 |
是指由數據庫系統事件觸發的觸發器 |
其中,DML觸發器,按照觸發時DML操作影響的記錄多少,又可分為:
行級觸發器 :DML語句每操作一行,行級觸發器就會被調用一次
語句級觸發器 :DML語句不論影響多少行數據,語句級觸發器只被調用一次
DDL觸發器又可以分為:
數據庫級DDL觸發器 :數據庫中任何用戶執行了相應的DDL操作該類觸發器都被觸發。
用戶級DDL觸發器 :只有在創建觸發器時指定方案的用戶執行相應的DDL操作時觸發器才被觸發,其他用戶執行該DDL操作時觸發器不會被觸發。
2.描述一個觸發器的組成部分及其作用。
答:在Oracle系統中,觸發器包括以下幾個組成部分:
組成部分 |
作用 |
1.觸發器名稱 |
觸發器名是在創建觸發器為觸發器起的名稱。一般包括:觸發器執行的時間、執行的操作、涉及的表、涉及的列等。 |
2.觸發語句 |
觸發語句是導致Oracle執行觸發器操作的誘因,它包括對觸發時間、觸發事件和觸發對象的定義。只有用戶對數據庫執行的操作滿足觸發語句中定義的所有內容后,觸發器才有可能被系統自動調用。 |
3.觸發限制條件 |
觸發限制條件是決定觸發器是否被系統自動調用的另一個因素。當用戶的操作滿足觸發語句時,觸發器不一定被調用,此時,系統還要檢查觸發器中是否定義了觸發限制條件,如果存在,還要檢查當前的操作是否滿足限制條件。 |
4.觸發器操作 |
觸發器操作是觸發器的主體,是被系統自動執行的PL/SQL 程序塊。當觸發語句和觸發限制條件都滿足時,系統將自動執行觸發器操作部分的代碼。 |
3.簡述替代觸發器的作用。
答:
創建觸發器時若選擇了INSTEAD OF子句,那么該觸發器就是替代觸發器。 替代觸發器只能建立在視圖上不能建立在表上。用戶在視圖上執行的DML操作將被替代觸發器中的操作代替。
替代觸發器主要解決對不可更新視圖執行更新操作時帶來的問題。在定義視圖時,如果視圖中沒有選擇基礎表的主鍵咧,或者視圖中的數據來自多個基礎表,那么用戶將無法對這樣的視圖直接執行插入、修改、刪除操作。這種情況下,用戶可以針對是視圖創建一個替代觸發器,將對視圖的更新操作轉換為對基礎表的操作。