oracle触发器

来源:互联网 发布:linux查看文件系统类型 编辑:程序博客网 时间:2024/06/08 19:42
触发器
表里面的数据发生改变,就改变另一张表中数据
触发器就是一个过程,与表关系密切,用于保护表中的数据。当一个基表被修改(增删改)时,触发器就自动执行
触发器可实现多个表之间数据的一致性和完整性
创建表的时候就可以定义触发器和序列
insert into test values(null,'张三')。

触发器的类型有3种
dml触发器
oracle可以在dml语句进行触发,可以在在dml操作前或操作后进行触发,并且可以对每一行后语句操作进行触发
替代触发器
由于oracle里,不能直接对由两个以上的表建立的视图进行操作,所以给出了替代触发器。它就是oracle 8专门为进行视图操作处理的一种处理方法
系统触发器
oracle 从8i开始 提供了第三种类型的触发器叫系统触发器。它可以在oracle数据库系统的事件进行触发,如oracle系统的启动与关闭等。





行级触发器,每修改一行就触发
非行级触发器,只在执行一条增删改操作的时候触发,比如总工资,不管员工表一个增删改语句影响了多少行数据,都只用更改一次总工资,



非行级触发器
-- 当有员工的工资发生变化时,出发事件修改该员工对应的部门工资数据
create or replace trigger dept_sal_trigger
--触发的时机
after
--触发的事件
update or insert or delete on emp1
--把员工对应的部门工资进行修改
declare
cursor total_sal is select sum(sal) total_sal,deptno from emp1 group by deptno;
dept_s dept_sal%rowtype;
begin
-- delete from dept_sal;
for dept_s in total_sal loop
update dept_sal set total_sal=dept_s.total_sal where deptno=dept_s.deptno;
-- insert into dept_sal values(dept_s.deptno,dept_s.total_sal);
end loop;
-- 不要添加commit;
EXCEPTION
when OTHERS THEN rollback;
end;



--测试触发器
update EMP1 set SAL=1600 where empno=7499;
COMMIT



行级触发器
create or replace trigger emp_sal_trigger
after update on emp1
for each row--行级触发器
begin
insert into emp_sal values (:old.empno,:new.sal, emp_sal_seq.nextval,sysdate,:old.sal);
exception
WHEN OTHERS THEN dbms_output.put_line('添加失败');
end;






触发器禁用
alter trigger emp_sal_trigger disable;
触发器启动
alter trigger emp_sal_trigger enable;



谓词的使用
--当有人的工资发生改变时,需要做记录
--当公司多了一个雇员的时候,添加记录中只有新的工资
--当有人离职时,需要把该员工的工资修改记录删除
create or replace trigger emp_sal_trigger
after update or insert or delete on emp1
for each row--行级触发器
begin
if updating
then insert into emp_sal values (:old.empno,:new.sal, emp_sal_seq.nextval,sysdate,:old.sal);
ELSIF inserting
then insert into emp_sal values (:new.empno,:new.sal, emp_sal_seq.nextval, sysdate ,0);
else
DELETE from emp_sal where empno=:old.empno;
end if;
exception
WHEN OTHERS THEN dbms_output.put_line('添加失败');
end;


利用伪记录
--要求工资只能增加不能降低
create or replace trigger keep_sal_trigger
before update on emp1
for each row
begin
if :new.sal<:old.sal
then :new.sal:=:old.sal;
end if;
end;
原创粉丝点击