只读数据库的限制条件(二)

日期: 2008-11-25 作者:杨廷坚 来源:TechTarget中国 英文

  首先要提到就是数据库链,在只读数据库中,通过数据库链进行查询,必须提交或回滚才能通过另外的数据库链访问其他数据库的对象,有点绕嘴,看例子吧:
  


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

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐