【问题标题】:Is database change notification better than trigger? [closed]数据库更改通知是否比触发器更好? [关闭]
【发布时间】:2015-06-12 21:12:09
【问题描述】:

我正在使用 Oracle 数据库和 WCF/WebAPI 服务开发应用程序。该服务应该知道更改数据库中的某些表。我在网上冲浪并在 Oracle RDBMS 中发现了一项名为“数据库更改通知”的技术,我认为这确实是我在这种情况下需要的东西。但是我的团队领导抱着我使用触发器来达到这个目的。

有人可以解释每种技术在通知服务表更改方面的优缺点吗?

我想跟踪insert,update,delete对表的操作,我打算通知服务的方式是使用UTL_HTTP包来调用服务的方法。

提前致谢!


更新:应尽快发送通知。因此,任何定期工作的方式(例如,将通知放入队列并每 1 分钟使用 oracle 作业处理它们)都不适合。

【问题讨论】:

    标签: c# .net oracle wcf asp.net-web-api


    【解决方案1】:

    数据库触发器适用于复杂的默认值或复杂的数据验证。不要将它们用于发送消息等应用程序逻辑。当 http 连接出现任何问题时,您将无法更改数据。 无论如何,您可以创建通知队列(例如使用新表或 Oracle 队列)并使用触发器填充它,这可能是安全的。然后编写一个作业,它将查询这个队列并发送通知。

    当您查看数据库更改通知概念时(参见http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_dcn.htm#BGBDBAIJ,图 13.2),您会发现它使用了相同的方法。

    所以我投票支持数据库更改通知。您无需使用触发器,只需注册对象并编写通知程序代码即可。

    【讨论】:

    • 感谢您的回复!我忘了提到该服务应该尽快从数据库接收通知。所以我希望您使用通知队列和作业的方法(因为我希望它是定期的)不适合这种需求?
    【解决方案2】:

    听起来您的团队负责人正在考虑 DBMS_ALERT,它使用触发器发送表事件信号。这可能适用于您的场景(鉴于我们不知道您要实现的目标的详细信息)。 Find out more.

    但是,数据库更改通知也可以工作。您已标记您的问题C#。如果您使用的是 ODP,则绝对应该考虑利用其内置支持。 Find out more。

    在这种情况下,最好的解决方案是见仁见智。你们比我们更清楚自己的处境。我建议你和你的团队负责人讨论一下。请记住,如果您推动不同的解决方案,那么您将有责任使其发挥作用;如果您的团队负责人之前有实施基于触发器的解决方案的经验,那么这可能是更安全的选择。

    【讨论】:

      【解决方案3】:

      数据库更改通知的一个可能缺点是从数据库回调到应用程序层。如果你有防火墙规则、安全区域等,你通常会允许从应用程序流到数据库层——而不是数据库更改通知需要的相反方式。因此,您可能正在处理安全异常以允许这种回流。在我看来,为了性能加速而牺牲安全性(更少的网络数据库查询)

      【讨论】:

      • 好吧,如果您的应用程序位于数据库服务器的同一本地网络中,那应该不是问题。但这确实是当您的应用程序部署在外部服务器(例如云)上时需要考虑的一点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 2019-01-13
      相关资源
      最近更新 更多