database link作用 一、創建database link 第一种: 1.根据远端的信息用Net Manager设置好能连接远端的服务及监听程序。 connect to yhd identified by neu 第二种: create database link linkyhd 二、使用DB link 查询远端数据库里的表 SELECT …… FROM 表名@数据库链接名; 查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名@dblink名”而已。 三、刪除Db Link 三、同义词 创建: CREATE SYNONYM 同义词名 FOR 表名; 刪除: drop SYNONYM 同义词名 ; SELECT * FROM GLOBAL_NAME; 修改可以用以下语句来修改参数值: ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE; <1>、当数据库参数global_name=false时,就不要求数据库链接名称跟远端数据库名称一样。 oracle数据库之间进行连接通讯。 创建数据库链接的语法如下: CREATE [PUBLIC] DATABASE LINK link CONNECT TO username IDENTIFIED BY password USING ‘connectstring’ 其中: --demona为用net8 easy config创建的连接字符串 目的方数据库的init.ora文件中的global_names设为false 重新启动数据库设置才能生效 或者用sys用户执行 注意:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。 一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。 创建数据库链接时,还可以使用缺省登录方式,即不指定远程数据库的用户名和密码: create public database link zrhs_link using ‘zrhs’; 在不指定用户名和口令的情况下,ORACLE使用当前的用户名和口令登录到远程数据库。 USING后面指定的是链接字符串,也就是远程数据库的网络服务名,这个服务名保存在TNSNAMES.ORA文件中,在该文件中定义了协议、主机名、端口和数据库名。 删除数据库链接的语句是: DROP [PUBLIC] DATABASE LINK zrhs_link 数据库链接的引用 一般情况下引用数据库链接,可以直接将其放到调用的表名或视图名称后面,中间使用一个 @ 作为分割符: SELECT * FROM worker@zrhs_link; 对于经常使用的数据库链接,可以建立一个本地的同义词,方便使用: CREATE SYNONYM worker_syn FOR worker@zrhs_link; 还可以建立一个本地的远程视图,方便使用: CREATE VIEW worker AS SELECT * FROM worker@zrhs_link where… ; 现在本视图可与本地数据库中的任何其它视图一样对待,也可以授权给其它用户,访问此视图,但该用户必须有访问数据库链接的权限。 对于另外一种情况,所要访问的表不在数据库链接中指定的远程帐户下,但该帐户有访问该表的权限,那么我们在表名前要加上该表的用户名: SELECT * FROM camel.worker@zrhs_link ; <2>、当数据库参数global_name=true时,那就要求数据库链接名称跟远端数据库名称一样 数据库全局名称可以用以下命令查出 SELECT * FROM GLOBAL_NAME; atabase link(dblink)--数据库链路 创建dblink的语法: sql>create database link 数据库链路名 connect to 用户名 identified by 口令 using '主机字符串名'; 如: sql>create database link ora9i.us.oracle.com ### 这里的us.oracle.com为oracle默认域名 ### connect to scott identified by tiger using 'sun'; 1)dblink名必须与远程数据库的全局数据库名(global_name)相同; 2)用户名,口令为远程数据库用户名,口令; 3)主机字符串为本机tnsnames.ora中定义的串; 4)两个同名的数据库间不得建立dblink; 然后,你就可以通过dblink访问远程数据库了。 如: sql>select * from 表名@ora9i.us.oracle.com; 还可以建立快照(snapshot)通过dblink实现远程数据自动传输。 查看所有的数据库链接,进入系统管理员SQL>操作符下,运行命令: SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK'; Db_domain:定义一个数据库所在的域,该域的命名同互联网的’域’没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。 Global_name:对一个数据库(Oracle database)的唯一标识,oracle建议用此种方法命令数据库。该值是在创建数据库是决定的,缺省值为Db_name. Db_domain。在以后对参数文件中Db_name与Db_domain参数的任何修改不影响Global_name的值,如果要修改Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO <db_name.db_domain>命令进行修改,然后修改相应参数。 Service_name:该参数是oracle8i新引进的。在8i以前,我们用SID来表示标识数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name参数,该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。该参数的缺省值为Db_name. Db_domain,即等于Global_name。一个数据库可以对应多个Service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即不必Service name 必须与SID一样。 Net service name:网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。 数据库 就是实际的磁盘上的文件(数据文件、日志文件、控制文件等),负责保存数据,但由对应的实例来操作它的数据 服务名 就是对外公布的名称,为网络监听服务 其实,在我们传统的概念里,数据库是一个统称的名字,在Oracle中,你可以把“数据库”理解成一个大概念,也要把它理解成一个小概念
1、一个Oracle数据库系统中可以同时安装几个数据库,每一个数据库对应一个唯 一的实例,但是OPS系统除外,可以多个实例同时对一个数据库操作,称为并行服务 器 2、只是一个名字,SID即是INSTANCE_NAME,SERVICE_NAMES主要用在监听器中, 为了方便吧,有些是为了传统习惯的延续,有些是为了更方便的使用 3、NET EASY CONFIG操纵的应该是主机字符串,是为客户端服务的 一个数据库可以对外公布多个服务名(SERVICE_NAMES) 一个客户端也可以用多个主机字符串连接到同一个数据库服务器上 4、一个OS上可以装多个Oracle数据库(小的概念),每个库可以对外公布多个服 务名,都通过init.ora和listener.ora来实现 Used TNSNAMES adapter to resolve the alias 建立步骤: 5、至此,在新疆的计算机上建立了一个DBLINK,用于连接到北京的数据库上, 6、关于global_name参数的测试 select * from bj_test@a--查询远程表 以上脚本全部在ORACLE817下通过测试。 创建 CREATE public database link test_link CONNECT TO scott IDENTIFIED BY tiger using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = LEE) ) )'; --使用 select ename from emp@test_link; --删除 drop public database link TEST_LINK;
一:dblink创建:
1、已经配置本地服务 create public database link toBeJing connect to scott
2、直接建立链接 create database link toBeJing connect to scott identified by tiger
其实两种方法配置dblink是差不多的,我个人感觉还是第二种方法比较好,这样不受本地服务的影响。 注意: 假如创建全局dblink,则必须使用systm或sys用户,在database前加public。 1.先创建PUBLIC DATABASE LINK,不用指定用户和密码 scott@TEST>conn system/test
实际上相当于: CREATE DATABASE LINK orcl USING 'BEJING' CONNECT TO scott IDENTIFIED BY tiger;
创建connected user的db link语法: 创建fixed user的db link语法:
所以,oracle模仿域名搞出一个global_name,global_name=db_name+db_domain。
二、dblink查询: 查看所有的数据库链接,进入系统管理员SQL>操作符下,运行命令:
DROP PUBLIC DATABASE LINK toBeJing
四、dblink使用: SELECT……FROM表名@数据库链接名; 查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名@dblink服务器”而已。 例:查询北京数据库中emp表数据 select * from emp@toBeJing;
五、同义词配合: 第四点中from emp@toBeJing可以创建同义词来替代:
如:create synonym bj_scott_emp for emp@toBeJing; 于是就可以用bj_scott_emp来替代带@符号的分布式链接操作emp@toBeJing
DB LINK是独立于创建用户(USER_DB_LINKS的USERNAME)起作用的,其他用户无法使用这个连接,无权限也不能删除它。 当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。下面讲介绍如何在本地数据库中创建dblink. 创建dblink一般有两种方式,不过在创建dblink之前用户必须有创建dblink的权限。想知道有关dblink的权限,以sys用户登录到本地数据库: select * from user_sys_privs t where t.privilege like upper('%link%'); 1 SYS CREATE DATABASE LINK NO 2 SYS DROP PUBLIC DATABASE LINK NO 3 SYS CREATE PUBLIC DATABASE LINK NO 可以看出在数据库中dblink有三种权限CREATE DATABASE LINK(所创建的dblink只能是创建者能使用,别的用户使用不了),CREATE PUBLIC DATABASE LINK(public表示所创建的dblink所有用户都可以使用),DROP PUBLIC DATABASE LINK。 在sys用户下,把CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK权限授予给你的用户 grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to scott; 然后以scott用户登录本地数据库 1.创建dblink的第一种方式,是在本地数据库tnsnames.ora文件中配置了要远程访问的数据库。 create public database link to_bylw connect to scott identified by tiger using 'bylw'; 其中to_bylw是你创建的dblink名字,bylw是远程数据库的实例名,scott/tiger是登录到远程数据库的用户/密码。然后在本地数据库中通过dblink访问远程数据库'bylw'中scott.tb_test表,sql语句如下所示 select * from scott.tb_test@to_bylw; 2.创建dblink的第二种方式,是在本地数据库tnsnames.ora文件中没有配置要访问的远程数据库, create database link to_test connect to scott identified by tiger using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.5)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = bylw) ) )'; 第二种是把第一种配置在tnsnames.ora文件中的信息,直接放在创建dblink语句后面。第一种情况tnsnames.ora文件中信息如下: bylw = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.5)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = bylw) ) ) 两台不同的数据库服务器,从一台数据库服务器的一个用户读取另一台数据库服务器下的某个用户的数据,这个时候可以使用dblink。其实dblink和数据库中的view差不多,建dblink的时候需要知道待读取数据库的ip地址,ssid以及数据库用户名和密码。 创建可以采用两种方式: 1、已经配置本地服务
2、未配置本地服务
其实两种方法配置dblink是差不多的,我个人感觉还是第二种方法比较好,这样不受本地服务的影响。 数据库连接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义. 数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样 数据库全局名称可以用以下命令查出 SELECT * FROM GLOBAL_NAME; 查询远端数据库里的表 SELECT …… FROM 表名@数据库链接名; 查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名@dblink服务器”而已。 附带说下同义词创建: CREATE SYNONYM同义词名FOR 表名; CREATE SYNONYM同义词名FOR 表名@数据库链接名; 删除dblink:DROP PUBLIC DATABASE LINK linkfwq。 如果创建全局dblink,必须使用systm或sys用户,在database前加public。
DBLINK详解
1.创建dblink语法:
CREATE [PUBLIC] DATABASE LINK link
CONNECT TO username IDENTIFIED BY password
USING ‘connectstring’
说明:
1) 权限:创建
数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私 有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。
2)link : 当GLOBAL_NAME=TRUE时,link名必须与远程数据库的全局数据库名global_name)相同;否则,可以任意命名。
3)connectstring:连接字符串,tnsnames.ora中定义远程数据库的连接串。
4)username、password:远程数据库的用户名,口令。如果不指定,则使用当前的用户名和口令登录到远程数据库。
2.删除数据库链接的语句:
DROP [PUBLIC] DATABASE LINK zrhs_link
3.查看已创建的dblink
select owner,object_name from dba_objects where object_type='DATABASE LINK';
4.dblink的引用:
[user.]table|view@dblink
如:
SELECT * FROM worker@zrhs_link;
SELECT * FROM camel.worker@zrhs_link ;
5.创建同义词:
对于经常使用的数据库链接,可以建立一个本地的同义词,方便使用:
CREATE SYNONYM worker_syn FOR worker@zrhs_link;
6.创建远程视图:
CREATE VIEW worker AS SELECT * FROM worker@zrhs_link where…;
现在本视图可与本地数据库中的任何其它视图一样对待,也可以授权给其它用户访问此视图,但该用户必须有访问数据库链接的权限。
其他:
修改GLOBAL_NAME的方法:
1.在远程数据库的init.ora文件中将global_names设为false。
或者
2.用sys用户执行如下语句:ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;
修改后重新启动数据库设置才能生效。
数据库全局名称可以用以下命令查出:SELECT * FROM GLOBAL_NAME;
===== dblink 实战 ======
1.dblink分为公有和私有两类。
公有dblink使用public修饰关键字。在create和drop的时候都需要使用public关键字。
公有dblink对所有人开放,在该dblink之上创建的同义词也会随之对所有人开放。(
测试并确认,不过测试是在一个实例多个用户之间进行)
私有dblink只有创建者可以访问,其上的同义词不能被其他用户访问。需为用户创建视图,并将视图授权给所需用户后,用户才可访问该视图。
另外,不能将带有dblink的同义词直接授权给用户。否则报错,其等价于:
grant select on table1@user1 to user2 *
ERROR at line 1:
ORA-02021: DDL operations are not allowed on a remote database
2.创建dblink时,可以使用连接字符串(与tnsname.ora中的),效率较高。
|