PL/SQL2009.4.23

//author 满晨晨
//time 2009 4 23上午


系级trigger
监听到系统发生事件之后 自动执行的代码块  所以是after!!!!

deleting  当向一个表执行delete动作时出发deleting事件
inserting  当向一个表执行insert动作时出发inserting事件
updating   当向一个表执行update动作时出发updating事件

都是返回true或者false


if deleting then
elsif inserting then
elsif updating then
else raise_application_error

 

 

 

create table t_emp_log2
(
who varchar2(10) not null,
action varchar2(10) not null,
actime date


);
create or replace trigger tri_emp2
after insert or update or delete
on t_emp

begin
if updating then
 insert into t_emp_log2(who,action,actime)values(user,'update',sysdate);
elsif deleting then
 insert into t_emp_log2(who,action,actime)values(user,'delete',sysdate);
elsif inserting then
 insert into t_emp_log2(who,action,actime)values(user,'insert',sysdate);
end if;
end;


对操作行为进行表述时候 不涉及数据  正常写

假如对操作行为更改的数据  进行数据操作时候referencing new as newrow
for each row


行级触发器 修改的是行的所有列的数据的时候referencing new as newrow
for each row
列级触发器修改的是某个列的数据的时候

 

after insert or update of ename
on t_emp

referencing new as newrow
for each row


create or replace trigger tri_emp2
after insert or update
on t_emp

begin
if updating then
 insert into t_emp_log2(who,action,actime)values(user,'update',sysdate);
elsif deleting then
 insert into t_emp_log2(who,action,actime)values(user,'delete',sysdate);
elsif inserting then
 insert into t_emp_log2(who,action,actime)values(user,'insert',sysdate);
end if;
end;

更新的数据保存到新表中用newrow
把删除的数据保存到 列触发器只能针对update  因为insert 插入数据的时候肯定是更改了行的所有列
create or replace trigger tri_emp4
after  update of ename
on t_emp
referencing new as newrow

for each row

begin
if updating then
 insert into t_emp_log2(who,action,actime)values(user,'update',sysdate);
INSERT INTO temp_new(ename,empno)
VALUEE(:newrow.ename,:newrow.empno);

       
elsif inserting then
 insert into t_emp_log2(who,action,actime)values(user,'insert',sysdate);
INSERT INTO temp_new(ename,empno)
VALUEE(:newrow.ename,:newrow.empno);
end if;
end;


行级触发器   new保存更改后的数据 old 保存删除之前的数据
update delete insert
列级触发器
只能update更改某列


视图 如果是多表
的话
不能用update更新
触发器instead只能用于更新视图时候用

当update更新视图时候 同时要更新基表 (如果视图时单表的时候 用update直接就可以更新 更新视图同时也更新基表
可当视图时多表的时候用update就不可以直接更新了 必须用触发器)
/**
create view t1_t2
as
select e.empno,e.ename,e.job,d.dname from t_emp e,t_dept d where d.deptno=e.deptno;
**/

 

create or replace view t1_t2
as
select e.empno,e.ename,e.job,d.dname from t_emp e,t_dept d where d.deptno=e.deptno;
create  or replace trigger t1_t2
instead of update on t1_t2
referencing new as newrow
for each row

begin

update t_emp  e set empno=:newrow.empno,ename=:newrow.ename,job=:newrow.job where empno=:newrow.empno;
/**
where指的是假如视图更新一个人的名字了 那么也要更改基表 怎么更改了 不加where全部都改了 加了where 假如视图更改的是1号 为刘德华 基表也要变成刘德华 那么更改到基表 用where判断基表号为1号 更新ename
**/

update t_dept d set dname=:newrow.dname where deptno=(select deptno from t_emp where empno=:newrow.empno);
end;

old 和new
create or replace trigger tir_t_emp2
before update on t_emp
referencing new as newrow  old as oldrow
for each row
begin 
INSERT INTO emp_NEW(EMPNO,ENAME,JOB,DEPTNO)    update  set对某一个数据进行更新 更新之前的数据存在一个表里 更新后的数据也放在一个表里
values
(:NEWROW.empno,:NEWROW.ename,:NEWROW.job,:NEWROW.deptno);更新后的数据保存在一个新的表中

INSERT INTO emp_OLD(EMPNO,ENAME,JOB,DEPTNO)
values
(:OLDROW.empno,:OLDROW.ename,:OLDrow.job,:OLDROW.deptno);更新前的数据保存在一个新的表中

end tir_t_emp2;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值