Oracle DB:电子邮件触发器的建议

时间:2012-04-23 13:50:07

标签: oracle11g

如果表中的特定列更新并更新同一表中的其他列,是否可以提供链接或Oracle数据库触发器示例(如果表中的特定列更新并发送电子邮件)?

实施例: 一个表有多个问题,有两列“Issue Added”和“Email Sent”,默认为“0”

Issue Added    Email Sent
     0             0

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

Issue Added    Email Sent
     1             0

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

Issue Added    Email Sent
     1             1

1 个答案:

答案 0 :(得分:1)

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

  1. 如果系统无法发送电子邮件(例如,因为SMTP服务器暂时关闭),则触发器将失败,触发语句将失败并回滚。由于您无法发送电子邮件,因此您真的想要停止基础交易是非常罕见的。
  2. 发送电子邮件是非交易性的。这意味着您将发送电子邮件以查找从未提交的更改。并且您将多次发送电子邮件,因为Oracle选择回滚并重新执行全部或部分INSERT语句,以保持写入一致性。
  3. 通常,您可以更好地使用数据库作业来定期查找需要发送电子邮件的行,发送电子邮件,然后更新表。您可以使用较早的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 package来实施send_email程序。您可能只需要使用适当的参数调用UTL_MAIL.SEND(假设您已配置了SMTP_OUT_SERVER参数,并且您的用户已被授予对UTL_MAIL包的适当访问权限以及允许您访问的ACL与该SMTP服务器通信。)