ITPub博客

首页 > 数据库 > Oracle > trigger的一些记载和自治事务的一个练习

trigger的一些记载和自治事务的一个练习

原创 Oracle 作者:dotaddjj 时间:2011-09-28 19:14:51 0 删除 编辑

很早之前就接触了trigger,不过长时间不用貌似其中有些细节真记不住了。

Trigger分为dml触发器,数据库级触发器,ddl触发 instead of触发

先前写过两张表的同步的一个dml触发

Create or replace trigger dml_trigger01

After insert or update or delete

On student01

For eache row

If inserting then

Insert into student02 values(:new.id.,:new:name);

Elsif updating then

Update student02 set id=:new.id,name=:new.name where id=:old.id and name=:old.name;

Else deleting then

Delete student02 where id=:old.id and name=:old.name;

End if;

End;

上述trigger是用student01的dml来同步更新student02。

Create一个登陆时间表

Create table test15(name varchar2(10),edate date)

创建ddl的触发

Create or replace trigger db_trigger01

After logon on database

Begin

Insert into logon01 values(user,sysdate);

End;

每次登入数据库都会向logon01表中插入数据

网友说到需要create trigger来避免drop对象,刚好ddl的模式trigger来raise异常可以满足。

Create or repalce trigger db_trigger02

After drop on schema

Begin

Raise_application_error(-20005,’ 无法删除’);

End;

此时drop user username会抛出raise异常。也避免了数据库内删除schema下的对象。不过有时候还是需要删除部分对象的,不然一个trigger就把此schema方案下无法drop了。

使其trigger失效。不然以后此schema下无法drop对象了。(不然drop时会报递归sql错误)

Alter trigger db_trigger02 disable

当然有drop on schema也有create 或者alter on schema了,自己尝试下吧!

今天看见网友给了一个自治事务和普通事务的练习,觉得不错,就贴出来了

Create table t(id number,varchar2(10));

create or replace procedure p1
as
begin
insert into t values(1,'test1');
for i in (select count(*) cnt from t) loop
dbms_output.put_line('p1:'||i.cnt);
end loop;
end;
/


create or replace procedure p2
as
pragma autonomous_transaction; --
自治事务
begin
insert into t values(2,'test2');
for i in (select count(*) cnt from t) loop
dbms_output.put_line('p2:'||i.cnt);
end loop;
commit; --
事务提交
end;
/


create or replace procedure p3
as
pragma autonomous_transaction; --
自治事务
begin
insert into t values(3,'test3');
insert into t values(4,'test4');
for i in (select count(*) cnt from t) loop
dbms_output.put_line('p3:'||i.cnt);
end loop;
p1; --
调用普通过程
p2; --
调用自治过程
commit;
end;
/

前面的blog中说到了自治事务和普通事务区别:自治事务是个独立的session,执行自治事务时会脱离上下文的环境。普通事务却是要看上下文环境的。

大家自己试试吧!

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1055383/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 回滚段记载
下一篇: b+ and bitmap index
请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662975