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列。
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
- Oracle数据库中触发器包含dblink
- oracle 触发器实现禁止在数据库中创建dblink ---通过触发器实现
- ORACLE中怎样建DBLINK到异构数据库?
- Oracle数据库DBLink
- oracle数据库建立dblink
- oracle数据库创建dblink
- oracle 10g中dblink访问远程oracle数据库
- 在oracle中建立dblink访问其他oracle数据库
- Oracle中创建DBLink
- oracle中创建dblink
- oracle中dblink创建
- 在oracle中建立dblink访问其他数据库
- 在oracle中建立dblink访问其他数据库
- Oracle不同数据库访问DBLink
- oracle 数据库创建DBLink 语法
- Oracle同义词与数据库dblink
- oracle数据库dblink设置错误
- oracle数据库dblink创建示例
- hibernate里实体类用int和Integer区别
- 【NOIP 模拟题】[T1]数列(找规律+欧几里得算法)
- VMnet1和VMnet8的区别
- 2016/11/14学习工作日志
- 2.7map容器类型
- Oracle数据库中触发器包含dblink
- 径向模糊实例
- 代码大全2 --- 33章 个人性格
- 解析php入库
- 图论(6)--邻接表的建立与入度出度
- Android中跨进程通讯的4种方式
- KAFKA源码阅读——FetchRequestPurgatory, ProducerRequestPurgatory
- ThinkPHP 学习笔记
- 链式前向星