1.語句級觸發器
先舉個栗子:
(1)建立一個日誌信息表emp_log用於存儲用戶對錶的操作。
SQL> create table emp_log(
2 who varchar2(30),
3 when date);
表已創建。
(2)在emp表上創建語句級觸發器,將用戶對emp表進行的操作記錄到emp_log表中。
SQL> create or replace trigger emp_op
2 before insert or update or delete
3 on emp
4 begin
5 insert into emp_log(who,when)
6 values(user,sysdate);
7 end emp_op;
8 /
觸發器已創建
(3)更新emp表,增加員工10%的薪金,確認觸發器正常運行。
SQL> update emp
2 set sal=sal*1.1;
已更新17行。
SQL> select * from emp_log;
WHO WHEN
------------------------------ --------------
SCOTT 26-10月-15
修改觸發器emp_op和emp_log表以便能夠記錄操作的類型。
(1)修改emp_log表,圍棋添加action列。
SQL> alter table emp_log
2 add (action varchar2(50));
表已更改。
SQL> desc emp_log
名稱 是否爲空? 類型
----------------------------------------- -------- -------------
WHO VARCHAR2(30)
WHEN DATE
ACTION VARCHAR2(50)
(2)修改觸發器,以便記錄操作的類型
SQL> create or replace trigger emp_op
2 before insert or update or delete
3 on emp
4 declare
5 var_action varchar2(50);
6 begin
7 if inserting then
8 var_action:='INSERT';
9 elsif updating then
10 var_action:='UPDATE';
11 elsif deleting then
12 var_action:='DELETE';
13 end if;
14 insert into emp_log(who,when,action)
15 values(user,sysdate,var_action);
16 end emp_op;
17 /
觸發器已創建
(3)更新某僱員的信息,測試觸發器。SQL> update emp
2 set sal=sal*1.2
3 where empno=7369;
已更新 1 行。
SQL> select * from emp_log;
WHO WHEN
------------------------------ -------------
ACTION
--------------------------------------------
SCOTT 26-10月-15
SCOTT 26-10月-15
UPDATE
2.行級觸發器
舉個栗子:
(1)創建一個測試表foo以及隨同使用的序列,序列的作用是生成一組排序數。
SQL> create table foo(sid number,sname varchar2(20));
表已創建。
SQL> create sequence seq_foo;
序列已創建。
(2)創建生成主鍵的行級觸發器。
SQL> create or replace trigger foo_trigger
2 before insert or update of sid
3 on foo
4 for each row
5 begin
6 if inserting then
7 select seq_foo.nextval
8 into :new.sid
9 from dual;
10 else
11 raise_application_error(-20020,'不允許更新ID值!');
12 end if;
13 end;
14 /
觸發器已創建
(3)向foo表中插入兩條數據,測試觸發器能否正常運行。
SQL> insert into foo(sid,sname)
2 values(1,'董鵬');
已創建 1 行。
SQL> insert into foo(sid,sname)
2 values(1,'劉麗');
已創建 1 行。
SQL> select * from foo;
SID SNAME
---------- --------------------
1 董鵬
2 劉麗
以上可以看出,無論是否提供sid值,sid都會使用seq_foo.nextval的值。
3.instead of觸發器
前提這個觸發器是定義在視圖上的。舉個栗子嗎?(1)創建一個視圖,顯示僱員的基本信息和所在部門的名稱。
SQL> connect sys/oracle as sysdba
已連接。
SQL> grant create view to scott;
授權成功。
SQL> connect scott/sunshumin
已連接。
SQL> create view emp_dep_view
2 as select empno,ename,job,sal,dname
3 from emp,dept
4 where emp.deptno=dept.deptno;
視圖已創建。
(2)如果視圖向表中添加記錄,則由於視圖引用了兩個表,添加記錄失敗。
SQL> insert into emp_dep_view(empno,ename,job,sal,dname)
2 values(8000,'董鵬','MANAGER',1500,'SALES');
insert into emp_dep_view(empno,ename,job,sal,dname)
*
第 1 行出現錯誤:
ORA-01776: 無法通過聯接視圖修改多個基表
(3)爲視圖創建一個instead of觸發器。
SQL> create or replace trigger insert_emp_deb_trigger
2 instead of
3 insert on emp_dep_view
4 for each row
5 declare
6 var_deptno emp.deptno%type;
7 begin
8 insert into emp(empno,ename,job,sal)
9 values(:new.empno,:new.ename,:new.job,:new.sal);
10
11 select deptno
12 into var_deptno
13 from dept
14 where dname=:new.dname;
15
16 update emp
17 set deptno=var_deptno
18 where empno=:new.empno;
19 end insert_emp_deb_trigger;
20 /
觸發器已創建
(4)使用同樣的語句測試觸發器。