Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle DB:Sugestão para acionador de e-mail


Geralmente, seria uma má ideia tentar enviar um e-mail em um gatilho.
  1. Se o sistema não puder enviar o e-mail (por exemplo, porque o servidor SMTP está temporariamente inativo), o acionador falhará e a instrução de acionamento falhará e será revertida. É muito raro que você realmente queira interromper a transação subjacente simplesmente porque não conseguiu enviar um e-mail.
  2. O envio de um e-mail não é transacional. Isso significa que você enviará e-mails para alterações que nunca serão confirmadas. E você enviará e-mails várias vezes porque a Oracle opta por reverter e reexecutar todo ou parte de um INSERT declaração para manter a consistência de gravação.

Em geral, você será muito mais bem servido com um trabalho de banco de dados que procura periodicamente as linhas que precisam ter um email enviado, envia os emails e, em seguida, atualiza a tabela. Você pode usar o antigo DBMS_JOB pacote ou o mais novo e mais sofisticado DBMS_SCHEDULER pacote. Algo na linha de
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 é programado para ser executado, digamos, a cada 5 minutos (você também pode usar o DBMS_SCHEDULER pacote)
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;

Você pode usar o pacote UTL_MAIL para implementar o send_email procedimento. Você provavelmente só precisa chamar UTL_MAIL.SEND com os parâmetros apropriados (assumindo que você configurou seu SMTP_OUT_SERVER parâmetro e seu usuário recebeu acesso apropriado ao UTL_MAIL pacote e para uma ACL que permite que você se comunique com esse servidor SMTP).