sql >> Base de Datos >  >> RDS >> Oracle

Oracle DB:Sugerencia para activación por correo electrónico

Por lo general, sería una mala idea intentar enviar un correo electrónico en un disparador.

  1. Si el sistema no puede enviar el correo electrónico (por ejemplo, porque el servidor SMTP está temporalmente inactivo), el activador fallará y la declaración de activación fallará y se revertirá. Es muy raro que realmente desee detener la transacción subyacente simplemente porque no pudo enviar un correo electrónico.
  2. El envío de un correo electrónico no es transaccional. Eso significa que enviará correos electrónicos para cambios que nunca se confirman. Y enviará correos electrónicos varias veces porque Oracle elige revertir y volver a ejecutar todo o parte de un INSERT instrucción para mantener la coherencia de escritura.

Por lo general, estará mucho mejor atendido con un trabajo de base de datos que periódicamente busca filas que necesitan enviar un correo electrónico, envía los correos electrónicos y luego actualiza la tabla. Puede usar el antiguo DBMS_JOB paquete o el más nuevo y más sofisticado DBMS_SCHEDULER paquete. Algo parecido a

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;

que luego está programado para ejecutarse, digamos, cada 5 minutos (también podría usar el DBMS_SCHEDULER paquete)

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;

Puede usar el paquete UTL_MAIL para implementar el send_email procedimiento. Probablemente solo necesites llamar a UTL_MAIL.SEND con los parámetros adecuados (suponiendo que haya configurado su SMTP_OUT_SERVER parámetro y a su usuario se le ha otorgado el acceso adecuado a UTL_MAIL paquete y a una ACL que le permite comunicarse con ese servidor SMTP).