将SQL Server数据库的模式与Oracle数据库匹配

时间:2014-03-03 05:25:19

标签: sql-server oracle database-schema

是否有已知产品可以在here所述的SQL Server和Oracle之间的任何级别执行架构匹配?如果不是产品,是否会有关于如何执行某些语义搜索和比较数据库表,字段甚至数据的文档化方法?

我有一个现有的SQL Server数据库,它目前在更新数据方面遇到很多麻烦,因为它使用了大量未记录且不可读的遗留代码来从各种外部数据源中提取信息。幸运的是,存在一个Oracle数据库,根据业务的性质,它似乎包含SQL Server DB所需的所有信息。问题是,两种环境之间的模式差别很大。它们不遵循通用的命名约定,甚至可能不遵循相同的规范化(某些表可能在一个表上是平的而在另一个表上是规范化的)。

考虑到两个数据库之间有数百个表,尝试遍历SQL Server中的每个表和列然后手动和可视地搜索Oracle上的可能匹配的天真方法似乎是不切实际的。

1 个答案:

答案 0 :(得分:0)

市场上有商业解决方案(即Database Compare Suite,Cross Database Studio),可用于比较同构和异构数据库环境。但是,仅为模式比较花钱购买这些工具并不是一个好主意。

可能有几种方法/工具/解决方案根据其范围具有某些限制。我给出了比较SQL Server和Oracle之间的模式匹配的解决方案。表格内容和数据结构等匹配程度取决于您的实施水平。

在我的方法中,建议采取以下步骤来完全满足您的要求:

  1. 将SQL Server链接服务器建立到Oracle数据库。回复路径中提到了步骤。
  2. 现在,直接从SQL Server环境本身访问SQL Server和Oracle表。使用以下方法比较表数据是可行的:
  3. SQL Server:

    select field1, field2, field_N from openquery(DEV, 'select * from oracle_owner_schema.testtable') 
    minus 
    select field1, field2, field_N from sqlserver_database.schema_name.testtable
    

    3您可以使用SQL Server和Oracle中的字典表以相同的方式比较数据结构(字段长度,数据类型,默认值等)。


    建立SQL Server链接服务器到Oracle数据库

    1. 设置ODAC

    2. 将缺少的DLL从instaclient复制到c:\ oracle \ product ... \ client_1 \ BIN [安装ODAC的位置。]

    3. 在c:\ oracle \ product ... \ client_1 \ network \ admin \ tnsnames.ora中添加主机名,端口号和服务名称,示例:

      LOCALSERVER =

      (DESCRIPTION =

      (ADDRESS_LIST =
      
        (ADDRESS = (PROTOCOL = TCP)(HOST = IP_Hostname_Oracle_Server)(PORT = 1521))
      
      )
      
      (CONNECT_DATA =
      
        (SERVICE_NAME = orcl)
      
      )
      

    4. SQL Server中的配置:

      一个。连接到SQL服务器

      湾数据库>服务器对象>链接服务器>提供商> OraOLEDB.Oracle>正确

      ℃。点击>属性>“选中启用'允许进程'”,然后保存。

      d。数据库>服务器对象>链接服务器>右键单击>新链接服务器>

      ************** TAB通用*************************

    5. 链接服务器:MSSQL中链接服务器的任何名称

      Provide name: Oracle Provider
      
      Product Name: Oracle
      
      Datasource: Provide name which you have added in tnsnames.ora 
      
      
      ****************Security TAB***************************
      
      Choose "Be made using this security contest:"
      
          Remote login: username for remote database <<e.g. guest >>
      
          With password: password <<e.g. guest>>
      

      使用方法:     select * from openquery(Linked_server_Name,'select * from schema_name.table_name'); 即从openquery中选择*(任意Name_for_link_server_in_MSSQL,'select * from oracle_owner_schema.testtable');

      注意:ODAC和oracle客户端的版本应该相同。