createtable emp_hi asselect*from empp where1=2;createorreplacetrigger tr_del_empp
before delete--指定触发时机为删除操作前触发on empp
for each row--说明创建的是行级触发器 begin--将修改前数据插入到日志记录表 del_emp ,以供监督使用insertinto emp_hi(empno,ename,job,mgr,hiredate,sal,comm,deptno)/*insert只会有new,代表着要插入的新记录
delete只会有old,代表着要删除的记录
update由于执行的是先删除旧的记录,再插入新的记录,因此new和old都会有,且含义与上面的相同
注:update触发器,可根据具体需求选择记录旧记录还是新记录。*/values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);end;-------------------------------------delete empp where empno=37807;select*from emp_hi;droptable emp_hi;droptrigger tr_del_empp;
2.1.2、限制对Departments表修改
--(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改departments表createorreplacetrigger tr_dept_time
before insertordeleteorupdateon dept
begin--raise_application_error( error_number_in IN NUMBER, error_msg_in IN VARCHAR2)自定义异常--error_number_in范围-20000 到 -20999 之间,这样就不会与 ORACLE 的任何错误代码发生冲突。--error_msg_in 的长度不能超过 2k,否则截取 2k。if(to_char(sysdate,'day')in('星期六','星期日'))or(to_char(sysdate,'hh24:mi')notbetween'08:30'and'18:00')then raise_application_error(-20001,'不是上班时间,不能修改dept表');endif;end;-------------------------------------deletefrom dept where deptno=40;droptrigger tr_dept_time;
2.1.3、限定只对部门号为101的记录进行行触发器操作
createorreplacetrigger tr_empp_sal_comm
before updateof sal,comm
ordeleteon empp
for each rowwhen(old.deptno=101)begincasewhen updating('sal')thenif :new.sal < :old.sal then
raise_application_error(-20001,'部门101的人员的工资不能降');endif;when updating('comm')thenif :new.comm < :old.comm then
raise_application_error(-20002,'部门101的人员的奖金不能降');endif;when deleting then
raise_application_error(-20003,'不能删除部门101的人员记录');endcase;end;-------------------------------------update empp set comm=6000where empno=37805;deletefrom empp where empno=37803;droptrigger tr_empp_sal_comm;
2.1.4、利用行触发器实现级联更新
/*。在修改了主表regions中的region_id之后(AFTER),
级联的、自动的更新子表countries表中原来在该地区的国家的region_id。*/createorreplacetrigger tr_reg_cou
afterupdateof deptno
on dept
for each rowbegin
dbms_output.put_line('旧的deptno值是:'||:old.deptno
||'、新的deptno值是:'||:new.deptno);update emp set deptno=:new.deptno
where deptno=:old.deptno;end;-------------------------------------update dept set deptno=60where dname='SALES';select*from emp;droptrigger tr_reg_cou;
2.1.5、在触发器中调用过程
createorreplaceprocedure add_emp
(p_emp_id emp.deptno%type,
p_start_date emp.sal%type,
p_end_date emp.ename%type)isbegininsertinto emp(deptno,sal,ename)values(p_emp_id,p_start_date,p_end_date);end;--创建触发器调用存储过程createorreplacetrigger update_emp
afterupdateof sal
on empp
for each rowbegin
add_emp(:old.deptno,:old.sal,:old.ename);end;-------------------------------------update empp set sal=6500where empno=