oracle課堂收錄-觸發器

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)使用同樣的語句測試觸發器。















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章