当Oracle中的特定数据库表发生更改时,我们需要触发一个进程。目前,使用触发器和触发该触发器时发生的一系列后续数据库操作开发了类似的进程。
但是,在此解决方案中,我们希望在数据库表中的行或一堆行发生更改时调用.NET组件(很可能是服务)。现在,您可以实现一种轮询机制,该机制将定期检查表以进行这些修改,然后在找到任何服务时实例化该服务。但是,我更喜欢采用更多事件驱动的方法。
我认为这是其他地方所做的事情所以我想知道其他人用什么方法来处理这些要求?
提前致谢
编辑:基础数据发生更改时触发的进程实质上是使用某些相关数据调用外部Web服务。我开始考虑这个调用是否应该作为将数据提交到数据库的同一过程的一部分发生,而不是由数据更改本身触发。
答案 0 :(得分:1)
你应该看看Oracle Database Extensions for .NET。
来自链接文章:
Oracle Database Extensions for .NET提供以下内容:
- Oracle数据库的公共语言运行时(CLR)主机
- 通过Oracle Data Provider for .NET类进行数据访问
- Visual Studio .NET的Oracle部署向导
您仍然会使用触发器来检测数据库更改,但不是触发您描述的所有数据库端逻辑,而是现在可以从.NET模块执行该逻辑。
答案 1 :(得分:0)
这听起来有可能,但可能需要一些腿部工作。我想你想看看Oracle Access Manager http://download.oracle.com/docs/cd/E12530_01/oam.1014/e10355/toc.htm
答案 2 :(得分:0)
这与保罗的相似;但不假设您在Windows计算机上安装了Oracle。
您可以使用dbms_scheduler创建一个可以调用外部流程的作业。
您可以直接呼叫remote external job from Oracle(这需要安装Oracle Scheduler Agent,但不需要其他任何内容)
它需要一些腿部工作才能设置身份验证等,但这样做有效。
然后你使用event to start your job(从你的触发器调用)。
这样,你实际上可以利用你已经编码的很多东西,只需要使用oracle调度程序来处理剩下的事情。
答案 3 :(得分:0)
Oracle提供了两种机制来处理以相当不错的方式描述的内容......在数据库端,您实现触发器以检测更改或在.NET端执行操作的任何内容......
对于通信,您使用基于Oracle内置排队技术(称为高级排队技术,AQ)的发布/子系统机制 - 一个很好的例子,请参阅http://www.devart.com/dotconnect/oracle/docs/AQ.html(不是附属的,只是一个快乐的客户)
另一种选择是使用内置的DBMS_ALERTER
包进行通信和异步通信 - 请参阅示例http://www.devart.com/dotconnect/oracle/docs/Devart.Data.Oracle~Devart.Data.Oracle.OracleAlerter.html
要明确:
上述技术(DBMS_ALERTER和AQ)是Oracle内置的技术,并不特定于任何第三方库......您只需要一个支持它们的ADO.NET提供程序......
编辑 - 在OP编辑之后:
如果您可以控制代码或调用触发数据更改的代码(WebService?)那么它确实是处理它的最佳方式纯粹是在.NET方面......这也是有助于处理此类更改遇到错误等情况。
答案 4 :(得分:0)
如果您使用的是Oracle的.NET驱动程序,则可以使用Oracle Continuous Query Notification (CQN)来执行此操作。
您只需给它一个普通的SELECT查询,只要该查询的结果集发生变化,它就会在您的应用中触发回调。
我所知道的一个问题是,当它最初运行查询以订阅连续通知时,它暂时需要一个独占锁。通常它不是什么大不了的事,因为你只是在启动时执行一次,所以同一个表上的任何其他数据库查询都会被阻塞一小段时间。