首先要提到就是数据库链,在只读数据库中,通过数据库链进行查询,必须提交或回滚才能通过另外的数据库链访问其他数据库的对象,有点绕嘴,看例子吧:
SQL> select name, open_mode from v$database; NAME OPEN_MODE ——— ———- TEST READ ONLY SQL> select db_link from user_db_links; DB_LINK ———————————————————————- CLIENT.NETDB RAC11G_S.US.ORACLE.COM TEST.NETDB TEST113.NETDB TEST11G TEST61 已选择6行。 SQL> select * from global_name@client.netdb; GLOBAL_NAME ——————————————————————— CLIENT.US.ORACLE.COM SQL> commit; 提交完成。 SQL> select * from global_name@test11g; GLOBAL_NAME —————————————————————– TEST11G.NETDB SQL> commit; 提交完成。 |
数据库链TEST11G和CLIENT都是可以访问的,不过不能在一个事务中同时访问两个数据库链:
SQL> select * from global_name@client.netdb; GLOBAL_NAME ——————————————— CLIENT.US.ORACLE.COM SQL> select * from global_name@client.netdb; GLOBAL_NAME ——————————————— CLIENT.US.ORACLE.COM SQL> select * from global_name@test11g; select * from global_name@test11g *第 1 行出现错误: ORA-16000: 打开数据库以进行只读访问 结束当前的事务,就可以访问数据库链了: SQL> rollback; 回退已完成。 SQL> select * from global_name@test11g; GLOBAL_NAME ——————————————— TEST11G.NETDB |
当前数据库是只读的,并不意味着不能执行DML操作,通过数据库链对远端数据库执行DML是没有问题的:
SQL> insert into t@test11g values (1); 已创建 1 行。 SQL> commit; 提交完成。 SQL> select * from t@test11g; ID ———- 1 |
显然通过只读数据库的数据库链对其他数据库进行DML操作是没有问题的,而试图通过数据库链对只读数据库进行DML显然是不允许的。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号

TechTarget
官方微博

TechTarget中国
作者
相关推荐
-
控制合约 不再畏惧Oracle
许多公司都与Oracle有无限制授权协议,他们害怕离开这个协议,所以就证明他们在使用Oracle的软件,即使因为需求单独购买部分授权许可也可能总体是省钱的。
-
如何应对Oracle EBS实施中的六个挑战?
在18个月的时间里,Vitamix启动运行了Oracle电子商务套件(E-Business Suite,EBS),而且Vitamix还对诸如Oracle ATG Web Commerce等所有页面属性进行了重新整理,并实现了全球数据中心。
-
DBA支招:如何实现Oracle EBS 12.2.5升级
那些对于是否要将EBS进行升级持观望态度的Oracle数据库管理员们可以从一家研究公司获得一些启示。
-
Oracle的云产品“砸了自己脚”?
Sparc和Solaris都是Oracle云计划的一部分,但是硬件和支持人员的减少意味着本地Solaris和Sparc将变得更加稀少。