包含DOMAIN的資料庫建立資料庫鏈到不包含DOMAIN的資料庫

yangtingkun發表於2009-08-22

題目有點長,但是沒有辦法,只有這麼長的題目才能把問題描述清楚。實際上,這樣說還缺少一個條件,就是初始化引數GLOBAL_NAMES設定為TRUE的情況下。

 

 

如果一個資料庫沒有包含DOMAIN資訊,那麼建立資料庫鏈的時候,資料庫鏈的名稱和給定的名稱保持一致。一旦資料庫的GLOBAL_NAME包含了DOMAIN資訊,則建立資料庫鏈的時候如果只指定資料庫名而沒有包含DOMAIN資訊,則資料庫會自動將當前的DOMAIN資訊新增到資料庫鏈中。

[oracle@bjtest ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on 星期五 8 21 19:28:18 2009

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


連線到:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
TEST9

SQL> alter database rename global_name to test9.us.oracle.com;

資料庫已更改。

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
TEST9.US.ORACLE.COM

SQL> create database link test08 connect to test identified by test using 'test08';

資料庫連結已建立。

SQL> select db_link from user_db_links;

DB_LINK
--------------------------------------------------------------------------------
TEST08.US.ORACLE.COM

SQL> select * from global_name@test08;

GLOBAL_NAME
--------------------------------------------------------------------------------
TEST08

雖然資料庫鏈的名稱和使用者指定的不一樣,但是由於在訪問資料庫鏈時,Oracle同樣會自動進行資料庫鏈的DOMAIN補充工作,因此對訪問遠端物件沒有太大的影響。

但是,這只是在初始化引數GLOBAL_NAMES設定為FALSE的情況下,一旦這個引數設定為TRUE,則無法訪問不包含DOMAIN的資料庫:

SQL> show parameter global_names

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE
SQL> alter system set global_names = true;

系統已更改。

SQL> select * from global_name@test08;
select * from global_name@test08
                          *
ERROR
位於第 1 :
ORA-02085:
資料庫連結TEST08.US.ORACLE.COMTEST08相連結


SQL> drop database link test08.us.oracle.com;

資料庫連結已丟棄。

SQL> create database link test08. connect to test identified by test using 'test08';
create database link test08. connect to test identified by test using 'test08'
                     *
ERROR
位於第 1 :
ORA-02084:
資料庫名不全


SQL> create database link test08@test08 connect to test identified by test using 'test08';

資料庫連結已建立。

SQL> select db_link from user_db_links;

DB_LINK
--------------------------------------------------------------------------------
TEST08.US.ORACLE.COM@TEST08

SQL> select * from global_name@test08@test08;
select * from global_name@test08@test08
                          *
ERROR
位於第 1 :
ORA-02085:
資料庫連結TEST08.US.ORACLE.COM@TEST08TEST08相連結


SQL> create database link "TEST08";

資料庫連結已建立。

SQL> select db_link from user_db_links;

DB_LINK
--------------------------------------------------------------------------------
TEST08.US.ORACLE.COM
TEST08.US.ORACLE.COM@TEST08

SQL> drop database link test08;

資料庫連結已丟棄。

SQL> create database link test08.null;
create database link test08.null
                     *
ERROR
位於第 1 :
ORA-02084:
資料庫名不全


SQL> create database link test08.'';
create database link test08.''
                     *
ERROR
位於第 1 :
ORA-02084:
資料庫名不全


SQL> create database link test08..;
create database link test08..
                     *
ERROR
位於第 1 :
ORA-02084:
資料庫名不全

可以看到無論採用什麼樣的方法都無法避免Oracle自動新增DOMAIN資訊,也就使得在GLOBAL_NAMESTRUE的情況下,無法再訪問那些不包含DOMAIN的資料庫。

好在這個GLOBAL_NAMES引數可以在會話級修改並覆蓋系統級的設定,這也是需要設定GLOBAL_NAMESTRUE的環境(比較高階複製環境和流環境等)的唯一解決方法了:

SQL> alter session set global_names = false;

會話已更改。

SQL> create database link test08 connect to test identified by test using 'test08';

資料庫連結已建立。

SQL> select db_link from user_db_links;

DB_LINK
--------------------------------------------------------------------------------
TEST08.US.ORACLE.COM
TEST08.US.ORACLE.COM@TEST08

SQL> select * from global_name@test08;

GLOBAL_NAME
--------------------------------------------------------------------------------
TEST08

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-612985/,如需轉載,請註明出處,否則將追究法律責任。

相關文章