Oracle-触发器

-----触发器  ----
/*
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,
它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。
触发器经常用于加强数据的完整性约束和业务规则等。
 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。
*/
----DML  ----------------------
----
create or replace  trigger  emp_trigger_update
before  update on emp  for each  row  ----  行级触发器 before  当某一行数据 发生 update 语句之前 先调用触发器
begin
  dbms_output.put_line('--- emp  before 行级触发器  update   ---');
  
  dbms_output.put_line('old'||:old.ename);  --- :old  修改之前的 emp 对象 
  dbms_output.put_line('new'||:new.ename); --- :new  修改之后的 emp 对象 
  
end;
   
update  emp set    ename='强'     where  empno=8888

create or replace trigger emp_trigger_update_after
after  update on emp  for each  row  ----  行级触发器 before  当某一行数据 发生 update 语句之前 先调用触发器
begin
  dbms_output.put_line('--- emp  after 行级触发器  update   ---');

  dbms_output.put_line('old'||:old.ename);  --- :old  修改之前的 emp 对象
  dbms_output.put_line('new'||:new.ename); --- :new  修改之后的 emp 对象

end;

----- 语句级 触发器
create or replace trigger   emp_trigger_before
before  update on emp --- 语句触发器 before
begin
  dbms_output.put_line('--- 语句级 语句触发器  before update   ---');
  
  ----- 语句级  没有 :old   :new
  --dbms_output.put_line('old'||:old.ename);  --- :old  修改之前的 emp 对象
  --dbms_output.put_line('new'||:new.ename); --- :new  修改之后的 emp 对象
end;

create or replace trigger   emp_trigger_after
after  update on emp --- 语句触发器 after
begin
  dbms_output.put_line('--- 语句级 语句触发器  after update   ---');
  
  ----- 语句级  没有 :old   :new
  --dbms_output.put_line('old'||:old.ename);  --- :old  修改之前的 emp 对象
  --dbms_output.put_line('new'||:new.ename); --- :new  修改之后的 emp 对象
end;

--- 当所有行 没有收影响时  行级出发器不触发   语句级  只要语法正确  都会执行一次  
update  emp set    ename='强'  where  deptno=10

---- 条件触发器 
create or replace trigger   emp_trigger_before
before   delete on emp  for  each row ---- 条件触发器  只能用于 行级 
when    (old.deptno=30)  
  
begin
  dbms_output.put_line('---条件触发器   before  delete   ---');

end;
delete from emp where deptno=30
select *from emp where deptno=30;
   
------  设计 工作职位的 更改 提醒    你从 那个 job  调到  那个 job
create or replace trigger   emp_trigger_job_update
after  update on emp for each row
when (old.job<>new.job)   --- when  () 
declare  

begin
  dbms_output.put_line(:old.ename||'从 '||:old.job||'调到'||:new.job);  
  
end;

update emp set job ='攻城狮' where deptno=40;

---- 涨薪提醒    谁从 多少工资  涨到了多少   涨了多钱   
create or replace  trigger sal_trigger
after  update on emp for each row
when (old.sal<new.sal)
  declare
   v_sal  number(7,2) :=:new.sal-:old.sal;
  begin
     dbms_output.put_line(:old.ename||'工资从 '||:old.sal||'涨到了'||:new.sal  ||'涨了'||v_sal);  
  
  end;
update emp set sal =sal-100 where empno=8888;
-----  old  new  别名
create or replace  trigger sal_trigger
after  update on emp 
referencing  old as o  new as n
for each row
when (o.sal<n.sal)
  declare
   v_sal  number(7,2) :=:n.sal-:o.sal;
  begin
     dbms_output.put_line(:o.ename||'工资从 '||:o.sal||'涨到了'||:n.sal  ||'涨了'||v_sal);  
  
  end;

----------------- 综合触发器 ---
create or replace  trigger   dept_all_trigger
before  update  or insert or delete  on dept   for  each row
begin
   if  inserting  then 
       dbms_output.put_line(' 添加。。。');  
   elsif  updating then
        dbms_output.put_line('更新。。。'); 
   else
      dbms_output.put_line('删除'); 
   end if;

end;

update dept  set  dname ='技术' where  deptno=40

delete  from dept where  deptno=50

----- 视图  触发器   --- 针对  不能对视图 进行 DML     
create   or replace   view   my_view  as select *from emp   ;


create or replace  trigger   view_trigger  
instead  of   delete  on   my_view  for each row
begin
  delete  from  emp  where deptno=:old.deptno;  
    
  dbms_output.put_line('删除');  
end;
delete from  my_view  where deptno=30  ---- 更新   视图  和 相关联的表
select *from emp;
select *from my_view;


----- 系统触发器  创建语句
create  or replace   trigger  oracle_trigger
after  create  on database

begin
  dbms_output.put_line(DICTIONARY_OBJ_TYPE);   --- 对象类型
  dbms_output.put_line(DICTIONARY_OBJ_NAME);    -- 名称
end;

create   or replace   view   my_view1  as select *from emp   ;


------  oracle  启动和关闭 必须登录管理员 
 startup  --- 
 shutdown  immediate

-----
create  or  replace  trigger  start_up
after  startup  on database
begin
  insert into emp(empno,ename) values(1112,'强兄');
  commit;
end;

create  or  replace  trigger  shut_down
before  shutdown  on database
begin
  insert into emp(empno,ename) values(1114,'强糖兄');
  commit;
end;

---- 解决  学生添加时  班级不存在的问题   自动添加班级

create or replace  trigger  stu_trigger_insert
before  insert  on stu_tab  
begin
  

end;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值