`

【转】通过DatabaseLink连接远程Oracle数据表的错误,及其变通方法

阅读更多
通过DatabaseLink连接远程Oracle数据表的错误,及其变通方法

这次做的项目,其中牵扯到跨数据库取数据的问题。
大概问题是这样的:
在一台服务器上有两个Oracle数据库实例oraOur和oraHR。
oraOur是我们自己建立的,里面有一些表,是和我们这个项目相关的。
oraHR是另外一套人事系统所用的,其中有4张表是关于确定使用者身份的(包括用户名、密码、电话、部门等信息的)。

现在客户要求我们自己开发的系统在登录时采用人事系统中的用户数据,这样方便管理。
客户是上帝。

我们想到了一个最直接的方法,就是让oraHR提供一个视图,里面包含了我们系统登录所要用到的数据。视图建立好之后,我们的程序在运行时分别向oraOur和oraHR建立连接,登陆时用oraHR连接,判断用户名、密码,并获取登录用户的基本信息。然后就像以前一样使用oraOur连接就可以了。

本以为事情就这么完了,没想到客户的一个需求使我们不得不改变策略。
客户要求:系统中的底层人员填写的申请单需经过3-4级审批,方可生效。
考虑到客户的多变性,我们决定将客户要求的3-4级审批改写成一个N级审批。其实3级审批的写法跟N级审批差不多,所以我们就决定这么做。

底层用户5000多名、2层用户1000多名、3层用户200多名、4层用户10名。这样的数据量虽然不大,但是按照我们的想法(将用户分组,然后根据组设定审批(因为人事系统给的视图信息不是很完整,里面缺少人员级别信息)),何况底层用户可以填写6种不同的单据,每种单据的审批流程还不一样,这样产生的数据量就不少了。要实现上述的功能,我们觉得应该能像访问本地数据表一样访问远程数据表(因为牵扯到联合查询),所以就建立了一个DatabaseLink来实现这个功能。一个DBLink很快就建立好了,在PL/SQL Dev中执行“select * from userinfo@orcl.us.Oracle.com”能得到我们想要的结果集。但是在C#里就不行。系统返回的错误是:ora-02041: 客户端数据库未开始一个事务处理。

既然错误说没有开始事务,那我们就把要执行的SQL语句当作一个事务来运行。我们在Oracle网站上找到了篇文章http://www.Oracle.com/technology/global/cn/pub/articles/price_dbtrans_do.Net.html,里面讲如何用OracleConnection对象来创建一个事务。我们按照文章上写的,创建了一个事务,结果程序还是报这个错误。这下该怎么办呢?我们上网查了一下,也没查出个所以然来。一般都是说:在一个事务内不要连续进行Commit,要在事务结束的时候进行一个Commit就行了。但是我们的SQL语句仅仅是一个查询。

快下班了,我们开始想起他的解决办法,最后想到了下面几种:
1、在本地建立一个视图,这个视图是由查询dblink中的视图建立,然后在程序中访问此视图。实验结果还是以出现上述错误告终。
2、在本地建立一个表,表结构与远程视图结构一致,然后每天将远程视图的内容更新到本表中。这样做是一个非常笨的方法,低效率与容易造成数据不同步。
3、在本地建立一个表,表结构与远程视图结构一致;在远程视图上建立触发器,当远程视图内容修改后,触发器修改本地的表。还是不行,因为建立在视图上的触发器不会因为基本表的修改而触发,这个视图触发器只能在有语句向视图本身作添加、删除、修改操作时才会触发。
4、远程视图是由4张基本表建立的,我们就想在本地也建立这4张基本表,然后在远程
数据库上建立触发器,每个表建立一个,当基本表数据修改时触发器会通过DBLink修改本地的基本表。为了保护原有的C#程序代码,我们在本地建立一个视图视图的建立语句与远程视图的建立语句一致,这样就用不到远程建立的视图了。最后结果证明这种方法是可行的。

这么一个问题我们两个人弄了两天,才算搞定。呵呵。

下面是我今天学习建立触发器的经验(Oracle数据库):
最基本的触发器是针对表的Insert、Update、Delete这三种操作来的。
触发器可以建立在表上,也可以建立在视图上。建立在表上的触发器会在表内容发生改变时触发。建立在视图上的触发器会在视图内容改变时触发。注意,视图触发器仅会在明确对视图进行操作的SQL语句执行时才会触发,当基本表的内容发生改变而引起视图内容变化时,不会触发视图触发器
触发器不能建立在DBLink的表上,只能在触发器里通过DBLink更新远程数据库的表

目前就这么点经验。

下面是建立DBLink的代码:

create public database link ora
  connect to system identified by manager
  using 's-server';

其中的ora,是你创建的链接的名称
里面的System是登录到远程数据库的用户名
manager是登录到远程数据库的密码
s-server是你现在登录的这台Oracle服务器.Net manager建立的到远程数据库的连接

使用的时候,只需这样:“select * from tablename@ora”即可访问远程数据库的tablename表,tablename表是属于你建立DBLink时所输入的用户名。

如果你执行这条sql语句的时候出现错误:ora通过gaac.world连接。类似这样的错误,说明远程数据库的init文件里把global names属性设为了true,只要将其改为false就可以了(要重启Oracle)。如果不能改这个参数,那你建立DBLink时的名字就要写成gaac.world(就是上面提示的那个错误中的名字)

下面是建立表触发器的代码:

create or replace trigger tg_E_CONTACT
  before update or insert or delete on E_CONTACT
  for each row
begin
  if inserting then
    insert into E_CONTACT@gaac.world
    values
      (:new.TELEPHONE, :new.EMPLOYEEID, :new.STATUS);
  else
    if updating then
      update E_CONTACT@gaac.world s
         set s.TELEPHONE  = :new.TELEPHONE,
             s.EMPLOYEEID = :new.EMPLOYEEID,
             s.STATUS     = :new.STATUS
       where s.employeeid = :old.employeeid;
    else
      if deleting then
        delete from E_CONTACT@gaac.world s
         where s.employeeid = :old.employeeid;
      end if;
    end if;
  end if;
end;


下面是建立视图触发器的代码:(注意里面的instead of)

create or replace trigger tg_E_CONTACT
  before instead of update or instead of insert or instead of delete on E_CONTACT
  for each row
begin
  if inserting then
    insert into E_CONTACT@gaac.world
    values
      (:new.TELEPHONE, :new.EMPLOYEEID, :new.STATUS);
  else
    if updating then
      update E_CONTACT@gaac.world s
         set s.TELEPHONE  = :new.TELEPHONE,
             s.EMPLOYEEID = :new.EMPLOYEEID,
             s.STATUS     = :new.STATUS
       where s.employeeid = :old.employeeid;
    else
      if deleting then
        delete from E_CONTACT@gaac.world s
         where s.employeeid = :old.employeeid;
      end if;
    end if;
  end if;
end;

 

分享到:
评论

相关推荐

    Oracle数据库如何创建DATABASE LINK

    此时,可以通过DATABASE LINK来访问远程数据库中的表: ```sql SELECT * FROM tbl_bjflb@taowei_to_101; ``` 6. **删除DATABASE LINK** 如果不再需要某个DATABASE LINK,可以使用以下命令将其删除: ```sql...

    Oracle DATABASE LINK(DBLINK)创建与删除方法

    Oracle DATABASE LINK,简称DBLINK,是一种在不同的Oracle数据库实例间建立连接的方式,允许用户在本地数据库上执行查询和操作远程数据库的数据。DBLINK为跨数据库的通信提供了简单且高效的解决方案。 创建DBLINK的...

    linux远程连接oracle数据库

    - **通过Java程序远程连接Oracle 10g数据库** - Java作为一种广泛使用的编程语言,可以用来开发各种应用程序,包括与数据库交互的应用。要实现Java程序远程连接Oracle 10g数据库,需要配置好Java环境,并使用Oracle...

    易语言连接远程Oracle数据库源码

    在易语言中,连接Oracle数据库一般会使用到ADODB(ActiveX Data Objects Database)组件,这个组件允许程序通过ODBC(Open Database Connectivity)接口与各种数据库系统进行交互,包括Oracle。在提供的文件中,...

    Database Link经典详解

    综上所述,Oracle数据库链接(Database Link)是一种用于实现分布式事务处理的重要机制。通过创建合适的数据库链接,可以有效地管理和访问跨多个数据库实例的数据资源。理解其创建过程及不同类型之间的区别,对于构建...

    使用plsql连接远程oracle(不安装本地oracle客户端)

    ### 使用PL/SQL连接远程Oracle数据库(无需安装本地Oracle客户端) 在进行远程Oracle数据库连接时,经常遇到的一个挑战是如何在没有本地Oracle客户端的情况下实现这一目标。本文将详细介绍如何使用PL/SQL Developer...

    Oracle创建Database link方法

    Oracle 创建 Database link 方法是指在 Oracle 中创建一个 Database link 的过程,这样可以实现跨库访问,即在一个数据库中可以访问另一个数据库中的数据。下面将详细介绍如何创建 Database link 以及通过 Database...

    oracle 存储过程 databaselink 收集

    ### Oracle存储过程与Database ...通过以上介绍,我们了解了如何在Oracle中创建和调用带有输入/输出参数的存储过程,以及如何创建和使用Database Link来访问远程数据库。这些技术对于实现复杂的应用程序逻辑非常有用。

    不用装Oracle客户端实现C#.NET连接远程Oracle数据库的一种方法

    本文将详细介绍一种无需安装Oracle客户端,仅使用C#.NET就能连接远程Oracle数据库的方法,这对于轻量级的开发环境或者不希望安装大型客户端的场景尤其适用。 首先,你需要下载Oracle的数据提供程序,即Oracle Data ...

    易语言连接远程Oracle示例

    易语言提供了多种数据库接口,如ODBC(Open Database Connectivity)和ADO(ActiveX Data Objects),这些接口允许程序通过标准的方式访问各种类型的数据库,包括Oracle。在本示例中,使用的可能是ADO接口,因为...

    oracle中databaselink创建

    databaselink是oracle数据库连接另一个数据库(可以是非oracle数据库)用的连接

    连接其他oracle数据库信息创建本地视图

    这可以通过创建数据库链接(Database Links)实现,标题“连接其他Oracle数据库信息创建本地视图”正是围绕这一主题展开。数据库链接允许我们在一个Oracle实例中创建对另一个Oracle实例的逻辑连接,从而能够查询远程...

    通过ORACLE通用连接访问SQLServer数据库的方法

    通过Oracle通用连接访问SQL Server数据库的方法为IT领域提供了一种跨数据库系统进行数据交互的有效途径。这种方法主要依赖于Oracle数据库的异构服务功能,允许用户从Oracle环境中直接查询或操作其他类型数据库(如...

    oracle通过dblink链接 mysql和mssql例子

    - 确保MSSQL服务器允许远程连接,并且TCP/IP协议已启动。 2. 配置ODBC数据源: - 按照MySQL的步骤配置ODBC数据源,命名为mssqlodbc。 3. 配置Oracle异构服务: - 与MySQL类似,创建初始化文件(例如...

    Oracle创建Database Link的两种方式详解

    Oracle数据库的Database Link是连接不同数据库之间的一种机制,它允许用户在本地数据库上执行查询,同时访问远程数据库的数据,仿佛这些数据就在本地一样。Database Link是Oracle数据库提供的一种分布式数据库功能,...

    Jdbc连接oracle远程数据库中文乱码解决

    本文将深入探讨如何通过JDBC(Java Database Connectivity)连接Oracle远程数据库时,解决中文乱码的困扰。 首先,我们需要理解的是,中文乱码通常源于字符集不一致或配置不当。在Java应用中,数据在JVM(Java...

    VC远程连接Oracle数据库方法

    本篇文章将详细讲解如何使用VC++通过ODBC(Open Database Connectivity)来实现远程连接Oracle数据库,同时适用于VC++ 6.0以及更新的版本如VS2005、VS2008和VS2010。 首先,我们需要了解ODBC的基本概念。ODBC是一个...

    通过.bat文件连接oracle 插入数据库记录

    标题中的“通过.bat文件连接Oracle 插入数据库记录”指的是使用批处理(.bat)脚本来操作Oracle数据库,实现数据的插入功能。Oracle是全球知名的关系型数据库管理系统,而批处理脚本则是在Windows操作系统中运行的一...

Global site tag (gtag.js) - Google Analytics