有人试验过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/
,如需转载,请注明出处,否则将追究法律责任。