oracle触发器before和after的问题。。求解答
createorreplacetriggertriafterinsertorupdateordeleteonempdeclarestrvarchar2(50);pragm...
create or replace trigger tri
after insert or update or delete on emp
declare
str varchar2(50);
pragma autonomous_transaction;
begin
commit;
str:='drop table emp_c';
execute immediate str;
str:='create table emp_c as select * from emp';
execute immediate str;
dbms_output.put_line('sss');
end;
如上代码。为什么我执行添加删除的时候,输出了sss,但是没有执行触发器里面的sql语句。
然后将after换成before之后,我对emp表执行添加删除,为什么他创建的emp_c表总是比emp表慢一步。例如:往emp插入了4条数据,但emp_c中只有前面的那3条。
理论上不是同步么。。 展开
after insert or update or delete on emp
declare
str varchar2(50);
pragma autonomous_transaction;
begin
commit;
str:='drop table emp_c';
execute immediate str;
str:='create table emp_c as select * from emp';
execute immediate str;
dbms_output.put_line('sss');
end;
如上代码。为什么我执行添加删除的时候,输出了sss,但是没有执行触发器里面的sql语句。
然后将after换成before之后,我对emp表执行添加删除,为什么他创建的emp_c表总是比emp表慢一步。例如:往emp插入了4条数据,但emp_c中只有前面的那3条。
理论上不是同步么。。 展开
2个回答
展开全部
1、触发器的作用,是每一条记录处理前后进行相应的处理,也就是说你每次处理一条emp的记录,都会执行一次drop和creare emp_c表。。。不要这样做啊,否则你插入1000条记录,就会重建1000次emp_c表
2、commit在触发器里面并不会提交当前事务,事实上insert emp和触发器是在同一个事物中的,相反,只有在这个事物最后,也就是说你的insert emp提交之后,emp_c才会真正提交。
2、commit在触发器里面并不会提交当前事务,事实上insert emp和触发器是在同一个事物中的,相反,只有在这个事物最后,也就是说你的insert emp提交之后,emp_c才会真正提交。
追问
我写的是语句级触发器。。不是行级触发器所以不会有你说的1。。
至于你说的2,我将after换成before之后,我对emp表执行添加删除,为什么他创建的emp_c表总是比emp表慢一步。例如:往emp插入了4条数据,但emp_c中只有前面的那3条。
也就是说他还是提交了的。只是少了最后那次所做的修改或者添加。
追答
执行时候的相关语句能贴出来吗?
说实话不太喜欢用触发器,宁愿用SQL程序块
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询