0

如果表中的特定列被更新并更新同一个表中的不同列,有人可以提供一个链接或 Oracle DB 触发器的示例,该触发器会发送电子邮件吗?

示例:一个表有多个问题,并且有两列“已添加问题”和“已发送电子邮件”,默认为“0”

Issue Added    Email Sent
     0             0

当“已添加问题”列更新为“1”时

Issue Added    Email Sent
     1             0

触发器发送电子邮件并更新“已发送电子邮件”列

Issue Added    Email Sent
     1             1
4

1 回答 1

1

尝试在触发器中发送电子邮件通常是个坏主意。

  1. 如果系统无法发送邮件(例如,由于 SMTP 服务器暂时宕机),触发器将失败,触发语句将失败并回滚。您很少会因为无法发送电子邮件而真正想要停止基础交易。
  2. 发送电子邮件是非事务性的。这意味着您将针对从未提交的更改发送电子邮件。而且您将多次发送电子邮件,因为 Oracle 选择回滚并重新执行全部或部分INSERT语句以保持写入一致性。

通常使用数据库作业会更好地为您服务,该作业会定期查找需要发送电子邮件的行,发送电子邮件,然后更新表。您可以使用较旧的DBMS_JOB包或更新和更复杂的DBMS_SCHEDULER包。类似的东西

CREATE OR REPLACE PROCEDURE process_issues
AS
BEGIN
  FOR i IN (SELECT * 
              FROM your_table_name
             WHERE issue_added = 1
               AND email_sent  = 0)
  LOOP
    send_email( i.issue_id );
    UPDATE your_table_name
       SET email_sent = 1
     WHERE issue_id   = i.issue_id;
  END LOOP;
END;

然后计划每 5 分钟运行一次(您也可以使用该DBMS_SCHEDULER软件包)

DECLARE
  l_jobno PLS_INTEGER:
BEGIN
  dbms_job.submit( l_jobno,
                   'BEGIN process_issues; END;',
                   sysdate + interval '5' minute,
                   'sysdate + interval ''5'' minute' );
  commit;
END;

您可以使用UTL_MAIL 包来实现该send_email过程。您可能只需要UTL_MAIL.SEND使用适当的参数进行调用(假设您已经配置了SMTP_OUT_SERVER参数并且您的用户已被授予对UTL_MAIL包和允许您与该 SMTP 服务器通信的 ACL 的适当访问权限)。

于 2012-04-23T15:54:33.370 回答