oracle的行級觸發器使用

2022-02-27 03:43:01 字數 3491 閱讀 6848

行級觸發器:

當觸發器被觸發時,要使用被插入、更新或刪除的記錄中的列值,有時要使用操作前、後列的值.

:new 修飾符訪問操作完成後列的值

:old 修飾符訪問操作完成前列的值

例1: 建立乙個觸發器, 當職工表 emp 表被刪除一條記錄時,把被刪除記錄寫到職工表刪除日誌表中去。

create   table  emp_his  as   select   *   from  emp  where   1 = 2 ; 

create or replace trigger tr_del_emp

before delete -- 指定觸發時機為刪除操作前觸發

on scott.emp

for each row -- 說明建立的是行級觸發器

begin

-- 將修改前資料插入到日誌記錄表 del_emp ,以供監督使用。

insert into emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )

values ( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );

end ;

delete emp where empno = 7788 ;

drop table emp_his;

drop trigger del_emp;

例2:限制對departments表修改(包括insert,delete,update)的時間範圍,即不允許在非工作時間修改departments表。

create   or   replace   trigger  tr_dept_time

before insert or delete or update

on departments

begin

if (to_char(sysdate, ' day ' ) in ( ' 星期六 ' , ' 星期日 ' )) or (to_char(sysdate, ' hh24:mi ' ) not between ' 08:30 ' and ' 18:00 ' ) then

end if ;

end ;

例3:限定只對部門號為80的記錄進行行觸發器操作。

create   or   replace   trigger  tr_emp_sal_comm

before update of salary, commission_pct

or delete

on hr.employees

for each row

when (old.department_id = 80 )

begin

case

when updating ( ' salary ' ) then

if :new.salary < :old.salary then

end if ;

when updating ( ' commission_pct ' ) then

if :new.commission_pct < :old.commission_pct then

end if ;

when deleting then

end case ;

end ;

/* 

例項: 

update employees set salary = 8000 where employee_id = 177; 

delete from employees where employee_id in (177,170); 

*/例4: 利用行觸發器實現級聯更新。在修改了主表 regions 中的 region_id 之後( after ),級聯的、自動的更新子表 countries 表中原來在該地區的國家的 region_id 。

create   or   replace   trigger  tr_reg_cou

after update of region_id

on regions

for each row

begin

dbms_output.put_line( ' 舊的region_id值是 ' || :old.region_id

|| ' 、新的region_id值是 ' || :new.region_id);

update countries set region_id = :new.region_id

where region_id = :old.region_id;

end ;

例5:在觸發器中呼叫過程。

create   or   replace   procedure  add_job_history

( p_emp_id job_history.employee_id % type

, p_start_date job_history.start_date % type

, p_end_date job_history.end_date % type

, p_job_id job_history.job_id % type

, p_department_id job_history.department_id % type

)isbegin

insert into job_history (employee_id, start_date, end_date,

job_id, department_id)

values (p_emp_id, p_start_date, p_end_date, p_job_id, p_department_id);

end add_job_history;

-- 建立觸發器呼叫儲存過程...

create or replace trigger update_job_history

after update of job_id, department_id on employees

for each row

begin

add_job_history(:old.employee_id, :old.hire_date, sysdate,

:old.job_id, :old.department_id);

end ;

oracle觸發器使用

size medium 語法規則 create or replace trigger 模式.觸發器名 before after insert delete update of 列名 on 表名 for each row when 條件 pl sql塊 說明 for each row的意義是 在一次操...

Oracle的觸發器使用

在oracle中想要插入資料或更新資料時能夠自動更新時間,需要使用使用觸發器,此處使用的工具時plsql 1.建表 create table rm catalog id varchar 64 primary key,name varchar 256 fatherid varchar 64 crate...

ORACLE觸發器 行級觸發器

行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸發器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例乙個簡單的...