行級觸發器:
當觸發器被觸發時,要使用被插入、更新或刪除的記錄中的列值,有時要使用操作前、後列的值.
: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會話中建立和示例乙個簡單的...