Oracle数据库中触发器包含dblink

来源:互联网 发布:数据采集卡的作用 编辑:程序博客网 时间:2024/06/13 09:15
Oracle数据库中触发器包含dblink
1、 基本概念
a) 触发器trigger:触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。
b) Dblink:
2、 测试准备
a) 准备数据库test1,test2
b) 两边都创建scott用户,都创建表test1
Alter user scott account unlock identified by “123123”;
Create table test1(id int);
c) 创建dblink,我用的是网络标识符
create public database link test1_test2 connect to scott identified by "123123" using 'test2';
d) 创建触发器
create or replace trigger tri_test1
  after insert on scott.test1
    for each row  
BEGIN insert into scott.test1@test1_test2 values (:new.id);
end;
3、 开始测试:
a) 测试网络正常
i. 开始在数据库test1的test1中插入一条数据
Insert into test1 values(1);
ii. 观察两个数据库中的数据
1. 其它会话观察1库的test1没有数据
2. 其他会话观察2库的test2也没有数据
3.
iii. 在当前会话执行commit
1. 其它会话观察1库的test1有数据
2. 其他会话观察2库的test2也有数据


结论:触发器和执行的语句化身为一个事务
b) 测试网络不正常
1.开始数据库test1的test1中插入一条数据
Insert into test1 values(2);
1. 断开网络
2. 执行commit
3. 结果:会话一直在等待
4. 查询等待时间
select inst_id,event,count(*) from gv$session where wait_class <> 'Idle' group by inst_id,event order by 1,2;
1 SQL*Net message from dblink
1 SQL*Net message to client
5. 网络再次接通,会话显示,commit成功
总结:
触发器的内容相当于事务的一部分,所以文档中有明确的说明,触发器不应有任何事务控制语言,因为其本身就是当前会话执行的语句的事务的一部分。无论触发器触发条件是before或者after,均不受影响。触发器中包含dblink,如果网络不好,会导致长时间的会话等待,会产生行级锁,影响其他会话。触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能是表中的任何long和blob列。
0 0
原创粉丝点击