设为首页 收藏本站
查看: 1073|回复: 0

[经验分享] SQL Server 2005 创建Oracle10g 的链接服务器

[复制链接]

尚未签到

发表于 2018-10-14 12:10:51 | 显示全部楼层 |阅读模式
  Oracle链接服务建立:
  * 安装oracle10g 的客户端:使用netmgr添加本地的服务命名,例如:服务命令:DBLINK;测试通过后进行下一步。
  * 建立ODBC数据源(现在已不需要,一般直接用Oracle本地服务名代替,本步可省略)
  SQL Server 2005 服务器增加系统数据源:
  [控制面板]=》[管理工具]=》[数据源(ODBC)]=》[系统DNS],添加基于 Oracle 的数据源:数据源名为:DBLINK(此名称尽量与Oracle的本地服务名一致),并进行连接测试。
  * 通过执行SQLServer存储过程来创建链接服务(直接使用Oracle本地服务名,这里本地服务名为CMCC):
  exec sp_addlinkedserver @server='LINK2ORACLE', @srvproduct='Oracle', @provider='MSDAORA', @datasrc='CMCC'
  * 链接登录配置:
  exec sp_addlinkedsrvlogin 'LINK2ORACLE',false,'sa','OracleUserName','OraclePassword' ;
  说明:此语句把远方DBServer的scott用户映射到本地的sa(该用户请根据实际进行更改)。
  链接服务器应用:
  A、查询Oracle数据表方式一(这种方式,当Oracle与SQLServer的数据类型不一致时经常报错,且速度稍慢):
  select * from [LINK2ORACLE]..[ORACLE_USER_NAME].TABLE_NAME;
  我在执行该语句经常报类似错误信息:链接服务器 "LINK2ORACLE" 的 OLE DB 访问接口 "MSDAORA" 为列提供的元数据不一致。对象 ""CMCC"."OS2_GIS_CELL"" 的列 "ISOPENED" (编译时序号为 20)在编译时有 130 的 "DBTYPE",但在运行时有 5。
  B、查询Oracle数据表方式二(经试验,这种方式使用起来很顺畅,不报错,且速度几乎和在Oralce中一样快):
  select * from openquery(LINK2ORACLE,'select * from OracleUserName.TableName')
  您可以把openquery()当成表来使用。
  C、举个例子(将Oralce用户CMCC下的基站表OS_GIS_BASESTATION导入到SQLServer2005数据库中):
  select * into OS_GIS_BASESTATION from openquery(LINK2ORACLE,'select * from CMCC.OS_GIS_BASESTATION')
  D、更便捷的方式:通过创建同义词进行便捷查询:
  CREATE SYNONYM OS_GIS_CELL FOR [ORACLELK]..[CMCC].OS_GIS_CELL;
  select * from os_gis_cell;
  select * from os_gis_cell a where a.CellName is null;
  注意:涉及 Oracle 部分的 SQL 语句,尤其是 [ORACLELINK]..[ORACLE_USER_NAME].TABLE_NAME 一定要大写,否则会报类似错误:
  消息 7314,级别 16,状态 1,第 1 行
  链接服务器 "ORACLELK" 的 OLE DB 访问接口 "MSDAORA" 不包含表 ""CMCC"."OS2_gis_CELL""。该表不存在,或者当前用户没有访问该表的权限。
  附:《链接服务器更详细的用法说明》
  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 或传递给>  在针对 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的客户端。
  假设安装到F:/oracle目录。
  注意需将ORACLE安装后的目录设为Everyone权限。
  (F:/oracle目录 增加  Authenticated Users  用户,将‘读取和运行’权限取消掉,再勾起来,重启windows!)
  2)配置F:/oracle/product/10.2.0/client_2/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>  G)选择安全性选项页,使用此安装上下文建立连接:
  a.远程登录:scott
  b.使用密码:tiger
  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' 为列提供的元数据不一致。执行时更改了元数据信息。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-621471-1-1.html 上篇帖子: 部署Lync Server 2013 SQL见证服务器 下篇帖子: iBATIS SQL Maps(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表