//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;