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

Oracle11g Oracle DB:电子邮件触发器的建议,oracle11g,Oracle11g,是否有人可以提供一个链接或Oracle DB触发器的示例,该触发器在表中的特定列更新并更新同一表中的不同列时发送电子邮件 例如: 一个表有多个问题,有两列“Issue Added”和“Email Sent”,默认为“0” Issue Added Email Sent 0 0 “已添加问题”列更新为“1”时 Issue Added Email Sent 1 0 触发器发送电子邮件并更新“已发送电子邮件”列 Issu

是否有人可以提供一个链接或Oracle DB触发器的示例,该触发器在表中的特定列更新并更新同一表中的不同列时发送电子邮件

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

Issue Added    Email Sent
     0             0
“已添加问题”列更新为“1”时

Issue Added    Email Sent
     1             0
触发器发送电子邮件并更新“已发送电子邮件”列

Issue Added    Email Sent
     1             1

通常情况下,尝试在触发器中发送电子邮件是个坏主意

  • 如果系统无法发送电子邮件(例如,因为SMTP服务器暂时关闭),触发器将失败,触发语句将失败并回滚。很少有人会因为无法发送电子邮件而真正想要停止底层事务
  • 发送电子邮件是非事务性的。这意味着您将发送电子邮件,请求从未提交的更改。您将多次发送电子邮件,因为Oracle选择回滚并重新执行
    INSERT
    语句的全部或部分,以保持写入一致性
  • 通常,数据库作业会更好地为您提供服务,它定期查找需要发送电子邮件的行,发送电子邮件,然后更新表。您可以使用较旧的
    DBMS\u作业
    包,也可以使用较新且更复杂的
    DBMS\u调度程序
    包。类似于

    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\u调度程序
    包)

    您可以使用来执行
    发送电子邮件
    过程。您可能只需要使用适当的参数调用
    UTL\u MAIL.SEND
    (假设您已配置了
    SMTP\u OUT\u服务器
    参数,并且您的用户已被授予对
    UTL\u MAIL
    包和允许您与该SMTP服务器通信的ACL的适当访问权限)

    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;