ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于TOM那个《export one on one》中的自治事务中的例子的问题

关于TOM那个《export one on one》中的自治事务中的例子的问题

原创 Linux操作系统 作者:lunar2000 时间:2002-09-18 08:44:58 0 删除 编辑
有人试验过TOM那个《export one on one》中第634页的例子么?
我试图用这种方法解决我们的这个问题,但是如果建立了阻止对表直接的触发器,那么连视图也更新不料了(如果不考虑对表直接更新的影响,这个方法我觉得是解决我们这个应用的最好的办法了)

大家怎么看?

试验步骤如下:
SQL> create table test(t number);

Table created.

SQL> create or replace view bb as select * from test;

View created.
SQL> create or replace trigger aa                                 
  2  instead of insert or delete or update on bb                  
  3  declare                                                      
  4   pragma autonomous_transaction;                              
  5  begin                                                        
  6   if INSERTING then                                          
  7    insert into test values(:new.t);                           
  8    commit;                                                   
  9   elsif UPDATING then                                         
10    update test                                                
11     set t=:new.t                                             
12     where t=ld.t;                                          
13    commit;                                                   
14   else                                                        
15    delete from test                                          
16     where t=ld.t;                                          
17    commit;                                                   
18   end if;                                                     
19                                                               
20  -- commit;                                                   
21  end;                                                         
22  /                                                            

Trigger created.

SQL> select * from test;  

no rows selected

SQL> insert into bb values(1);

1 row created.

这个时候,打开另一session,可以看见:bepone> sqlplus test/test

SQL*Plus: Release 8.1.7.0.0 - Production on Wed Sep 18 08:28:52 2002

(c) Copyright 2000 Oracle Corporation.  All rights reserved.


Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
JServer Release 8.1.7.0.0 - Production

SQL> select * from bb;

         T
----------
         1

SQL>

但是,如果为了阻止对表直接更新(因为对表直接更新仍然存在那个问题,虽然发生的几率非常小),所以又做了这个触发器:
SQL>  create or replace trigger aaa                                                
  2   before insert or delete or update on test                                    
  3   begin                                                                        
  4    raise_application_error(-20000,'Cannot Insert/Update/Delete Directly.');     
  5   end;                                                                          
  6  /

Trigger created.

SQL> insert into bb values(2);
insert into bb values(2)
            *
ERROR at line 1:
ORA-20000: Cannot Insert/Update/Delete Directly.
ORA-06512: at "TEST.AAA", line 2
ORA-04088: error during execution of trigger 'TEST.AAA'
ORA-06512: at "TEST.AA", line 5
ORA-04088: error during execution of trigger 'TEST.AA'


SQL>
这个有什么解决办法么?另外,为什么TOM的例子和这个几乎差不多,他还能列出查询结果?大家有试验成功的么,比较着急,在线等待。

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

请登录后发表评论 登录
全部评论

注册时间:2008-09-27

  • 博文量
    33
  • 访问量
    77937