在Oracle10g中如何建立没有域名的DB_LINK

来源:互联网 发布:红鹊豆网络 编辑:程序博客网 时间:2024/05/03 21:59

如何建立没有域名的DB_LINK

在网上查了好久问题终于解决了!请看如下记录:
(我给出详细注释)
事实证明:
--用alter语句这种修改方法,重启数据库,无效!
alter database rename global_name to ORCL;

--用alter语句这种修改方法,重启数据库,有效!但是不是我想要的结果,虽然域名修改后变短了,但是建立DB_LINK还有域名存在!
alter database rename global_name to ORCL.QIANGGUO.COM;

--用update语句这种修改方法,重启数据库,有效!创建DB_LINK没有域名存在!
update global_name set global_name='ORCL';


Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.

C:/Documents and Settings/Administrator>sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 3月 19 14:22:37 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> show parameter global_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE
SQL> show parameter global_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE
SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------

ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM

SQL> alter database rename global_name to ORCL;  

数据库已更改。

SQL> select * from global_name;  --在这里可以看到,把global_name直接修改为“ORCL”,并不起作用!

GLOBAL_NAME
--------------------------------------------------------------------------------

ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size             134218432 bytes
Database Buffers          146800640 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> select * from global_name; ---重启数据库后,仍然不起作用,GLOBAL_NAME并没有变成我想要的“ORCL”!

GLOBAL_NAME
--------------------------------------------------------------------------------

ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM

SQL> alter database rename global_name to ORCL.QIANGGUO.COM;  --如果修改为带域名的“ORCL.QIANGGUO.COM”,重启数据库将起作用,域名发生了变化!

数据库已更改。

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------

ORCL.QIANGGUO.COM

SQL> alter database rename global_name to ORCL;  --再次试着修改为”ORCL“,仍然不行!

数据库已更改。

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------

ORCL.AHDX.COM

SQL> update global_name set global_name='ORCL'; --如果用update语句修改,重启数据库,成功!哈哈!

已更新 1 行。

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------

ORCL

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------

ORCL

SQL> commit;

提交完成。

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size             134218432 bytes
Database Buffers          146800640 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> select * from global_name;--如果用update语句修改,重启数据库,成功!哈哈!

GLOBAL_NAME
--------------------------------------------------------------------------------

ORCL

SQL>


分析一下:global_name视图

创建global_name视图的语句如下:

create or replace view global_name
as
select value$ from sys.props$ where name = 'GLOBAL_DB_NAME'

不能直接修改sys.props$内部表,会告诉你权限不足!
所以可以用update修改!

验证如下:
SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------

ORCL

SQL> select value$ from sys.props$ where name = 'GLOBAL_DB_NAME';

VALUE$
--------------------------------------------------------------------------------

ORCL

SQL>

在oracle下如何创建database link

--创建database link
CREATE DATABASE LINK 数据库链接名
CONNECT TO 用户名 IDENTIFIED BY 密码
USING ‘本地配置的数据的实例名’;

注:如果创建全局dblink,必须使用systm或sys用户,在database前加public。

-- 删除database link
DROP PUBLIC DATABASE LINK 数据库链接名

--查询远端数据库里的表:
SELECT …… FROM 表名@数据库链接名;

--同义词创建
CREATE SYNONYM 同义词名 FOR 表名;
CREATE SYNONYM 同义词名 FOR 表名@数据库链接名;

--建立一个本地的远程视图
CREATE VIEW HI_FLDDICT
AS
SELECT * FROM  HI_FLDDICT@hr_oracle

详细步骤;

1 查看global_name

SQL> show parameter global_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE
SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------

ORCL

SQL>

2 如果global_names为FALSE

当数据库参数global_name=false时,就不要求数据库链接名称跟远端数据库名称一样,可以随便命名。

例如:
(1)已经配置本地服务
-- Drop existing database link
drop public database link HR_ORACLE;

-- Create database link
create public database link HR_ORACLE
  connect to user identified by password
  using 'hr';
 
(2)未配置本地服务  优点是这样不受本地服务的影响
create database link HR_ORACLE_TEST
connect to user identified by password
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 101.101.101.101)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = hr)
)
)'; 
 
 

3 如果global_names为TRUE
当数据库参数global_name=true时,那就要求数据库链接名称跟远端数据库名称一样。

-- Drop existing database link
drop public database link AHHR;

-- Create database link
create public database link AHHR
  connect to user identified by password
  using 'hr';