oracle10g- oracle 触发器 行级触发器 语句级触发器 替换触发器
加锁 select * from t1 for update;
行级触发器
create or replace trigger del_deptid
after delete on deptment
for each row
begin
delete from emp where id=:old.id;
end del_deptid;
/
如果rollback 两个表的信息都会回滚
--**************
create or replace trigger ins_dept
after insert on deptment
for each row
begin
insert into emp(eid,ename,id)values('34','fs',:new.id);
end;
/
--***************
触发器工作原理 事务相关
两个重要的内存表
insert new
delete old
update new old
--***********
create or replace trigger update_dept
after update on deptment
for each row
begin
update emp set id=:new.id where id=:old.id;
end;
/
触发器里面不能写rollback 和commit
阻止更新
create or replace trigger books_delete
after delete on books
for each row
begin
if :old.id='1' then
raise_application_error(-20000,'不允许删除!');
end if;
end;
/
**************************************************************************************
以上的行级触发器
下面是语句级的触发器
create or replace trigger dml_aa
after insert or update or delete
begin
if inserting then
insert into logs values(user,sysdate,'i');
elseif deleting then
insert into logs values(user,sysdate,'d');
else
insert into logs values(user,sysdate,'u');
end if;
end;
/
***************
create or replace trigger seq_next
before insert on auto
for each row
declare
idn number(5);
begin
select myseq.nextval into idn from dual;
:new.a=idn;
end;
/
通过以上的设置就可以使得在往auto 里面插入数据的时候可以用任意的a了因为到了真正插入操作的时候就会有这个触发器来自动生成a的值
***************************************************************************
替换触发器解决多表更新的问题 这种触发器只能建立在视图上
create or replace trigger tr_v
instead of insert on v_emp_dept
for each row
begin
insert into deptment values(:new.id,:new.dname);
insert into emp (eid,ename,sex,id) values(:new.eid,:new.ename,:new.sex,:new.id);
end;
/