oracle数据库(触发器)

触发器
触发器是一种过程,与表关系密切,用于保护表中的数据,当一个基表被修改(insert、update或delete)时,触发器自动执行;触发器可实现多个表之间的数据的一致性和完整性
触发器的类型:
DML触发器 :oracle可以在DML语句进行触发,可以再DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发
替代触发器:由于在oracle里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是oracle 8专门进行视图操作的一种处理方法
系统触发器:oracle从8i开始提供了第三种触发器叫系统触发器。它可以在oracle数据库系统的事件中进行触发,如oracle系统的启动和关闭等
触发器的语法:
create[or replace] trigger[schema.]trigger_name
{before|after|instead of}
{delete[or insert] [or update][of colunm,...n]}
on[schema.]table_name|view_name
[for each row [when(condition)]]
trigger_body
实例:当有员工的工资发生变化时,出发事件修改该员工对应的部门工资数据
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;
触发器的禁用:
ALTER TRIGGER EMP_SAL_TRIGGER DISABLE;

触发器的启用:
ALTER TRIGGER EMP_SAL_TRIGGER ENABLE;

删除触发器:
drop trigger table1test;

查询当前用户的所有触发器:
select * from user_triggers;
DML触发器
伪记录":old" 和 ":new",":old"代表操作完成前的旧记录;":new"代表操作完成后的新记录
在执行三种DML语句时":old" 和 ":new"的存在情况
触发语句
:old
:new
insert
null
要插入的记录
update
更新前的记录
更新后的记录
delete
要删除的记录
null
实例:--要求工资只能增加不能降低
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;
触发器中使用谓词:
谓词用来判断用户所执行的DML语句的类型:inserting、updating、deleting
实例:当有人的工资发生改变时,需要做记录;当公司多了一个雇员的时候,添加记录中只有新的工资;当有人离职时,需要把该员工的工资修改记录删除
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;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值