trigger instead of 事件触发 用户和系统

来源:互联网 发布:天刀怎么看捏脸数据库 编辑:程序博客网 时间:2024/05/03 13:48

定义:instead of

      1) 基于view表单的处理可以在表和视图上指定一个instead of 触发器

      2) 执行这种触发器可以代替原来的触发器,instead of 触发器扩展了视图跟新类型

      3) 每一个表和视图只能有一个instead of 触发器

      4) INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图

      5) INSTEAD OF触发器的主要优点就是可以使不能更新的视图支持更新。基于多个表的视图必须使用。

      6) INSTEAD OF触发器来支持多个表中数据的插入、更新和删除操作。
      注:不能在带有with check option 定义的视图中创建INSTEAD OF触发器

 

第一:instead of 触发器:

a: 有关insert的触发时间的触发器

--step 1 create referenced table

Sql代码 复制代码 收藏代码
  1. create table stu(   
  2. stu_id number(9) primary key,   
  3. stu_name varchar2(25)   
  4. )   
  5.   
  6. create table course(   
  7. c_id number(9) primary key,   
  8. grade varchar2(25),   
  9. foreign key (c_id) references stu(stu_id)   
  10. )  

 --step 2 create a view

Sql代码 复制代码 收藏代码
  1. create view sc_view as    
  2. select stu.stu_id,stu.stu_name,course.grade from stu,course where stu.stu_id=course.c_id  

测试:testing insert one statement

Sql代码 复制代码 收藏代码
  1. insert into sc_view values(5,'lily','75');  

结果:result:

 

 --step3  create a trigger

Sql代码 复制代码 收藏代码
  1. create or replace trigger tri_sc_view   
  2. instead of insert on sc_view   
  3. begin  
  4. insert into stu values(:new.stu_id,:new.stu_name);   
  5. insert into course values(:new.stu_id,:new.grade);   
  6. end;  

 提示:很多人纠结为什么 插入 stu & course表中的:new.stu_id是一样了?其实new.stu_id只是一个数值而已,那这句语句分析insert into sc_view values(5,'lily','75'); :new.new.stu_id 就是5,:new.stu_name就是‘lily’,:new.grade就是‘75’。他们的产生是根据创建的视图表sc_view的到的。触发器的执行过程是,先遇到触发事件这里指:insert into sc_view values(5,'lily','75'); 然后产生想对应的:new.stu_id ,:new.stu_name,:new.grade。将这些值赋值给了触发器作用的表单; 

 

执行语句:

1)

Sql代码 复制代码 收藏代码
  1. insert into sc_view values(1,'justin','88');   
  2. insert into sc_view values(2,'irs','70');   
  3. insert into sc_view values(3,'danile,'90);   
  4. insert into sc_view values(4,'tina,'75');   
  5. insert into sc_view values(5,'lily','75');  

 结果:

Sql代码 复制代码 收藏代码
  1. select * from sc_view  

 

  

Sql代码 复制代码 收藏代码
  1. select * from stu  

 

 

Sql代码 复制代码 收藏代码
  1. select * from course  

 

 

创建了view的trigger以后,可以直接通过添加wiew表单的数据来实现其他关联表的处理。。

 

2)

Sql代码 复制代码 收藏代码
  1. insert into stu values(6,'eric');  

 

Sql代码 复制代码 收藏代码
  1. insert into course values(6,'95');  

 

结果:

 

实际上是一起跟新的...

 

b)有关更新update的触发器;

Sql代码 复制代码 收藏代码
  1. select * from employees   
  2.   
  3. create sequence empl_seq;   
  4.   
  5. alter table employees drop(job_id,manger_id,department_id,dn)   
  6.   
  7. insert into employees values(empl_seq.nextval,'daniel','hwong','daniel@yahoo.com','15902701688',sysdate,2000,.12);   
  8.   
  9. insert into employees values(empl_seq.nextval,'justin','williams','justin@yahoo.com','15902701114',sysdate,5000,.12);   
  10.   
  11. create or replace view tt_view as  
  12. select employees.first_name||','||employees.last_name v_name,employees.email,employees.phone_no,employees.employee_id from employees   
  13.   
  14. select * from tt_view   
  15.   
  16. update tt_view set v_name='justin2,william2'where employee_id=2   
  17. --执行弹出 oracl-01733此处不允许修改虚拟值--   
  18.   
  19. create or replace trigger tri_employ   
  20. instead of update on tt_view   
  21. begin  
  22. update employees set    
  23.                      employees.first_name=substr(:new.v_name,instr(:new.v_name,',')+1),   
  24.                      employees.last_name=substr(:new.v_name,1,instr(:new.v_name,',')-1),   
  25.                      employees.phone_no=:new.phone_no,   
  26.                      employees.email=:new.email   
  27.                      where employees.employee_id=:new.employee_id;   
  28. end;  

第二:用户事件触发器;

Sql代码 复制代码 收藏代码
  1. create trigger ad_startup   
  2.  after startup   
  3.   on database  
  4. begin  
  5.  -- do some stuff   
  6. end;  

 第三:系统触发器;

-----用户事件:用户登陆、注销,CREATE / ALTER / DROP / ANALYZE / AUDIT / GRANT / REVOKE /
RENAME / TRUNCATE / LOGOFF

 

Sql代码 复制代码 收藏代码
  1. create table droped_objects(   
  2.  object_name varchar2(30),   
  3.  object_type varchar2(30),   
  4.  dropped_on date);  

 

Sql代码 复制代码 收藏代码
  1. create or replace trigger log_drop_trigger   
  2.  before drop on donny.schema  
  3. begin  
  4.  insert into droped_objects values(   
  5.   ora_dict_obj_name,  -- 与触发器相关的函数   
  6.   ora_dict_obj_type,   
  7.   sysdate);   
  8. end;  

 

Sql代码 复制代码 收藏代码
  1. create table drop_me(a number);   
  2. create view drop_me_view as select *from drop_me;   
  3. drop view drop_me_view;   
  4. drop table drop_me;   
  5. select *from droped_objects  

 

禁用和启用触发器
alter trigger <trigger_name> disable;
alter trigger <trigger_name> enable;
事务处理:
在触发器中,不能使用commit / rollback
因为ddl语句具有隐式的commit,所以也不允许使用

原创粉丝点击