首页 > 数据库 > Oracle > trigger的一些记载和自治事务的一个练习
很早之前就接触了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/ ,如需转载,请注明出处,否则将追究法律责任。