注意:1、触发器的大小不能超过32K,如果确实需要建立触发器,应该先建立存储过程,然后在触发器中调用
?? ? 2、触发器只能包含select、insert、update和delete语句,而不能包含DDL语句和事务控制语句
?? ? 3、触发器代码不能从触发器所对应的基表中读取数据
语句级触发器:
create or replace trigger tr_sec_emp
before insert or update or delete on emp
begin
??if to_char(sysdate,'DY','nls_date_language=AMERICAN') in('SAT','SUN') then
?? ?case
?? ? ?when inserting then
?? ? ? ?raise_application_eroor(-20001,'不能在休息日增加雇员');
?? ? ?when updating then
?? ? ? ?raise_application_error(-20002,'不能在休息日更新雇员');
?? ? ?when deleting then
?? ? ? ?raise_application_eroor(-20003,'不能在休息日删除雇员');
?? ?end case;
??end if;
end;
/
行级触发器:
create or replace trigger tr_emp_sal
before update of sal on emp
for each row
begin
??if :new.sal < :old.sal then
?? ?raise_application_error(-20010,'工资只涨不降');
??end if;
end;
/
限制行级触发器:
create or replace trigger tr_sal_change
after update of sal on emp
for each row
when (old.job = 'SALESMAN') ?--用when限制触发条件
declare
??v_temp int;
begin
??select count(*) into v_temp from audit_emp_change where name = :old.ename;
??if v_temp = 0 then
?? ?insert into audit_emp_change values (:old.ename,:old.sal,:new.sal,sysdate);
??else
?? ?update audit_emp_change set oldsal = :old.sal,newsal = :new.sal,time=sysdate
?? ?where name = :old.ename;
??end if;
end;
/
---------------------------------------------------------
机遇复杂视图的触发器:
grant create view to lixin;--授权建立视图
--建立视图
create or replace view dept_emp as select a.deptno,a.dname,b.empno,b.ename
from dept a, emp b where a.deptno = b.deptno;
--建立触发器:
create or replace trigger tr_instead_of_dept_emp
instead of insert on dept_emp --关键字,只能针对视图
for each row --只能是行级
declare
??v_temp int;
begin
??select count(*) into v_temp from dept where deptno= :new.deptno;
??if v_temp = 0 then
?? ?insert into dept(deptno,dname) values(:new.deptno,:new.dname);
??end if;
??select count(*) into v_temp from emp where empno =:new.empno;
??if v_temp = 0 then
?? ?insert into emp(empno,ename,deptno) values(:new.empno,:new.ename,:new.deptno);
??end if;
end;
/
---------------------------------------------------------
管理触发器:
查看:select * from user_triggers;
禁用:SQL> alter trigger TR_EMP_SAL disable;
启用:SQL> alter trigger TR_EMP_SAL enable;
禁用表的所有触发器:SQL> alter table emp disable all triggers;
重新编译:SQL> alter trigger TR_EMP_SAL compile;
删除:SQL> drop trigger TR_CHECK_SAL;
?