【问题标题】:Two triggers, one procedure两个触发器,一个过程
【发布时间】:2015-07-07 00:37:04
【问题描述】:

无法解决仅发送一封邮件而不是发送两封邮件的问题。

我有两个表格,其中包含报告状态和有关日志的信息。 在第一个表中,我输入了这样的触发条件:

create or replace TRIGGER test1
conditions
begin
send email
end. 

在第二张表上,我创建了一个类似的触发器 test2

我的目标不是发送 2 封电子邮件,而是仅发送 1 封电子邮件,即使 test1 触发器和 test2 触发器的条件都存在于数据库中。

所以我看的是这样的:Execute procedure in a trigger

但不知道如何让程序二检查两个触发器是否运行。

有没有其他方法可以解决这个问题?

【问题讨论】:

  • 嗨,欢迎来到 Stackoverflow。您能否分享您的代码,以便更轻松地为您提供帮助。
  • 不确定您的电子邮件是如何发送的,但如果它正在调用其他一些 STMP 或外部进程,那么直接从触发器执行此操作可能会出现问题。如果 DML 回滚了怎么办?如果电子邮件发送过程不是交易的一部分,那么您不能“撤消”它。您可以创建一个工作请求表并让触发器写入该表,然后让进程或 Oracle AQ 读取该表并发送电子邮件。
  • 您的 2 个表会在同一个事务中更新吗?如果不是第一个不知道它不应该立即发送电子邮件。您在触发器中检查的条件是什么?
  • 简而言之,我可以肯定的是,您想要的东西无法可靠而理智地实现。不同表中的触发器在不同时间触发。除非第二个触发器的主体也检查第一个触发器的条件,并且只有在它自己的条件满足而另一个不满足的情况下才发送电子邮件,……但是哎呀,我的脑痛。这两种情况都不会经常触发,不是吗(每天不超过几次,最好每周几乎为零次),所以双邮件不会受到伤害。

标签: sql oracle plsql


【解决方案1】:

假设您有权创建一个额外的表。假设 TRIGGER test1 仅在 (condition=)monday ... 运行,TRIGGER test2 仅在 (condition=)tuesday 运行。当 test1 运行时,它不会立即发送电子邮件,而是在额外表中为 - example - customer_A 插入一条记录。当 test2 运行时,它会检查 customer_A 是否已经收到邮件。如果是这样,则不会发送新邮件。如果不是……那么将发送一封新邮件。这样,customer_A 就不会在星期一在星期二收到邮件。 Customer_A 是表中的唯一标识符。一段时间后,表应该被清理,或者你引入一个时间机制来跟踪最近发送的邮件。

【讨论】:

  • 这将是一个解决方案,但无权创建表或修改数据。
  • 可惜了。如果您可以定制您的应用程序,那就太好了。转义选项可能是:您从第一个触发器内部 - 通过 UTL_FILE - 将您的收件人写入文件。第二个触发器检查文件并按照它的方式行事。这样,文件充当数据库外部的表。但总的来说,这不是一个非常优雅的解决方案。
猜你喜欢
  • 2017-09-06
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
相关资源
最近更新 更多