USE [master]
GO
EXEC --添加服务
master.dbo.sp_addlinkedserver --命令名称
@server = N'TEST', --参数1,连接oracle的数据源名称
@srvproduct=N'ORACLE', --参数2,连接的数据源的产品名称
@provider=N'MSDAORA', --参数3,访问的接口方式
@datasrc=N'ERPORA' --参数4,被访问的数据源名称
GO
EXEC --添加用户
master.dbo.sp_addlinkedsrvlogin --命令名称
@rmtsrvname = N'TEST', --数据源名称
@locallogin = NULL , --本地登陆
@useself = N'False', --指定用用户名和密码登陆
@rmtuser = N'SCOTT', --用户名称
@rmtpassword = N'a123456' --用户密码
go
select * from TEST..ERP.BAS_DEPT --测试结果
USE [master]
GO
EXEC --从本地 SQL Server 实例中的已知远程服务器和链接服务器的列表中删除服务器。
master.dbo.sp_dropserver
@server=N'TEST',
@droplogins='droplogins'
GO
/*语法
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
Oracle Microsoft OLE DB Provider for Oracle MSDAORA 用于 Oracle 数据库的 SQL*Net 别名
Oracle,版本 8 及更高版本 Oracle Provider for OLE DB OraOLEDB.Oracle 用于 Oracle 数据库的别名
参数
[ @server = ] 'server'
要创建的链接服务器的名称。server 的数据类型为 sysname,没有默认值。
[ @srvproduct = ] 'product_name'
要添加为链接服务器的 OLE DB 数据源的产品名称。product_name 的数据类型为 nvarchar(128),默认值为 NULL。如果为 SQL Server,则不必指定 provider_name、data_source、location、provider_string 和 catalog。
[ @provider = ] 'provider_name'
与此数据源对应的 OLE DB 访问接口的唯一编程标识符 (PROGID)。对于当前计算机中安装的指定 OLE DB 访问接口,provider_name 必须唯一。provider_name 的数据类型为 nvarchar(128),默认值为 NULL;但如果忽略 provider_name,则使用 SQLNCLI。SQLNCLI 是 SQL 本机 OLE DB 访问接口。OLE DB 访问接口应以指定的 PROGID 在注册表中注册。
[ @datasrc = ] 'data_source'
由 OLE DB 访问接口解释的数据源的名称。data_source 的数据类型为 nvarchar(4000)。data_source 作为 DBPROP_INIT_DATASOURCE 属性传递以初始化 OLE DB 访问接口。
[ @location = ] 'location'
由 OLE DB 访问接口解释的数据库的位置。location 的数据类型为 nvarchar(4000),默认值为 NULL。location 作为 DBPROP_INIT_LOCATION 属性传递以初始化 OLE DB 访问接口。
[ @provstr = ] 'provider_string'
OLE DB 访问接口特定的连接字符串,它可标识唯一的数据源。provider_string 的数据类型为 nvarchar(4000),默认值为 NULL。provstr 或传递给 IDataInitialize 或设置为 DBPROP_INIT_PROVIDERSTRING 属性以初始化 OLE DB 访问接口。
在针对 SQL 本机客户端 OLE DB 访问接口创建链接服务器后,可将 SERVER 关键字用作 SERVER=servername/instancename 来指定实例,以指定特定的 SQL Server 实例。servername 是运行 SQL Server 的计算机名称,instancename 是用户将连接到的特定 SQL Server 实例的名称。
[ @catalog = ] 'catalog'
与 OLE DB 访问接口建立连接时所使用的目录。catalog 的数据类型为 sysname,默认值为 NULL。catalog 作为 DBPROP_INIT_CATALOG 属性传递以初始化 OLE DB 访问接口。在针对 SQL Server 实例定义链接服务器时,目录指向链接服务器映射到的默认数据库。
*/
/*语法
sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'
[ , [ @useself = ] 'useself' ]
[ , [ @locallogin = ] 'locallogin' ]
[ , [ @rmtuser = ] 'rmtuser' ]
[ , [ @rmtpassword = ] 'rmtpassword' ]
参数
[ @rmtsrvname = ] 'rmtsrvname'
应用登录映射的链接服务器的名称。rmtsrvname 的数据类型为 sysname,没有默认值。
[ @useself = ] 'useself'
确定用于连接远程服务器的登录名。useself 的数据类型为 varchar(8),默认值为 TRUE。
值为 true 时指定登录使用自己的凭据连接 rmtsrvname,忽略 rmtuser 和 rmtpassword 参数。false 指定使用 rmtuser 和 rmtpassword 参数连接指定 locallogin 的 rmtsrvname。如果 rmtuser 和 rmtpassword 也设置为 NULL,则不使用登录名或密码来连接链接服务器。
[ @locallogin = ] 'locallogin'
本地服务器上的登录。locallogin 的数据类型为 sysname,默认值为 NULL。NULL 指定此项应用于连接到 rmtsrvname 的所有本地登录。如果不为 NULL,则 locallogin 可以是 SQL Server 登录或 Windows 登录。对于 Windows 登录来说,必须以直接的方式或通过已被授权访问的 Windows 组成员身份授予其访问 SQL Server 的权限。
[ @rmtuser = ] 'rmtuser'
当 useself 为 false 时,表示用于连接 rmtsrvname 的用户名。rmtuser 的数据类型为 sysname,默认值为 NULL。
[ @rmtpassword = ] 'rmtpassword'
与 rmtuser 关联的密码。rmtpassword 的数据类型为 sysname,默认值为 NULL。
*/
/*语法
sp_dropserver [ @server = ] 'server'
[ , [ @droplogins = ] { 'droplogins' | NULL} ]
参数
[ @server = ] 'server'
要删除的服务器。server 的数据类型为 sysname,无默认值。server 必须存在。
[ @droplogins = ] 'droplogins' | NULL
指示如果指定了 droplogins,那么对于 server,还必须删除相关的远程服务器和链接服务器登录名。@droplogins 的数据类型为 char(10),默认值为 NULL。
*/
/*
前提条件
1)在SQL_SERVER 2005服务器上安装Oracle 9i的客户端。
假设安装到D:/99.88.66.software/02.oracle目录。
注意需将ORACLE安装后的目录设为Everyone权限。
2)配置D:/99.88.66.software/02.oracle/02.Ora92I/network/admin/tnsnames.ora 文件。
配置示例
HAODAIFU=
(DESCRIPTION =
(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.119)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = haodaifu))
)
3)在DOS模式下运行以下命令以便确认ORACLE客户端安装无误。
a:sqlplus scott/a123456@haodaifu
b:tnsping haodaifu
C:/Documents and Settings/Administrator>tnsping haodaifu
TNS Ping Utility for 32-bit Windows: Version 11.1.0.6.0 - Production on 13-12月-2007 04:36:15
Copyright (c) 1997, 2007, Oracle. All rights reserved.
已使用的参数文件:
D:/99.88.66.software/02.oracle/DB11G/11G/network/admin/sqlnet.ora
已使用 TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 192.168.8.122)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = haodaifu))
)
OK (10 毫秒)
4)打开控制面板-服务,确认Distributed Transaction Coordinator服务已经启动。
5)修改注册表HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSDTC/MTxOCI
OracleOciLib = oci.dll
OracleSqlLib = orasql9.dll
OracleXaLib = oraclient9.dll
6)重启SQL_SERVER服务器
7)图形创建链接服务器方法--〉
A)打开SQL SERVER Management Studio,新建链接服务器。
B)链接服务器:写上链接服务器的名字,如:test
C)访问接口:选择 Microsoft OLE DB Provider for Oracle
D)产品名称:写上 Oracle
E)数据源:写上tnsnames.ora 文件中配置的服务名,如:haodaifu
F)访问接口字符串:user id=用户名;password=口令(可以省略)
G)选择安全性选项页,使用此安装上下文建立连接:
a.远程登录:scott
b.使用密码:a123456
H)确定
8)SQL的写法有两种
a)使用T-SQL语法:
SELECT * FROM LNK1..用户名.表名--注意用户名称,表名称要大写
b)使用PLSQL语法:
select * from openquery(LNK1,'select * from 用户名.表名')
第二种访问方式比第一种约快50%;第二种访问方式跟直连ORACLE的速度相当;
第一种访问方式可能会导致一些意外错误,如:该表不存在,或者当前用户没有访问该表的权限。
如果需要访问的column中使用没有精度的数据类型,这两种查询方式都可能会报错,这是ORACLE的BUG,
无法修正,只能通过查询语句的特殊处理规避这一问题:
OLE DB 提供程序 'OraOLEDB.Oracle' 为列提供的元数据不一致。执行时更改了元数据信息。
*/
---------------
以下是个人对上面的学习,写了个存储过程加深印象
/*
远程登录ORALCE数据库进行下载数据
步骤 1. 判断要连接的服务器是否开启的
2. 对服务器进行连接
3. 执行操作
*/
drop procedure Proc_DownLoadData
go
create procedure Proc_DownLoadData
(
@serverName varchar(20) , ---服务器名
@dataSour varchar(20) , ---数据库名
@userName varchar(20) , ---数据库用户名
@userPwd varchar(20), ---数据库密码
@isUpdate VARCHAR(1) ,
@tableName varchar(20) ---表名
)
AS
IF @isUpdate=1
BEGIN
DECLARE @isServer int ----1、判断要添加的服务是否已经存在
SELECT @isServer=0 FROM MASTER.DBO.SYSSERVERS WHERE SRVNAME=@serverName
IF @isServer = 0 --->>存在服务器
BEGIN
SELECT '已经存在该服务器了,请检查'
END
ELSE
BEGIN
DECLARE @isExist int --->>2.添加一个服务
EXEC @isExist = master.dbo.sp_addlinkedserver
@server=@serverName, --连接oracle的数据源名称
@srvproduct = 'ORACLE' , --产品名
@provider = 'MSDAORA' , --提供商
@datasrc = @dataSour --数据源
set @isExist=0 -->>
select '成功添加服务'
IF @isExist =0
BEGIN
DECLARE @isOK int --->>3.添加一个用户登录
EXEC @isOK = master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=@dataSour, --数据源名称
@locallogin=NULL, --本地登陆
@useself=N'false', --指定用用户名和密码登陆
@rmtuser=@userName, --用户名名称
@rmtpassword=@userPwd --用户密码
set @isOK = 0
select '成功添加一个用户'
END
END
END
-----------
/*
exec Proc_DownLoadData @serverName='ORCL' ,@dataSour='ORCL',
@userName ='BJYC', USERpwd='HUIKE', @ISUPDATE='1' ,@tablename='tblclient'
*/
exec dbo.Proc_DownLoadData @serverName = orcl, @dataSour = orcl, @userName = bjyc, @userPwd = huike, @isUpdate = 1, @tableName = tblclient
---1.使用T-SQL语法:
---SELECT * FROM LNK1..用户名.表名--注意用户名称,表名称要大写
select * from orcl..BJYC.TBLCLIENT
---2.使用PLSQL语法:
---select * from openquery(LNK1,'select * from 用户名.表名')
select * from openquery(orcl,'select * from bjyc.tblclient')