Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle DB:suggerimento per il trigger e-mail

In genere sarebbe una cattiva idea provare a inviare un'e-mail in un trigger.

  1. Se il sistema non è in grado di inviare l'e-mail (ad esempio, perché il server SMTP è temporaneamente inattivo), l'attivazione avrà esito negativo e l'istruzione di attivazione avrà esito negativo e verrà eseguito il rollback. È molto raro che tu voglia davvero interrompere la transazione sottostante semplicemente perché non sei stato in grado di inviare un'email.
  2. L'invio di un'e-mail non è transazionale. Ciò significa che invierai e-mail per le modifiche che non vengono mai impegnate. E invierai e-mail più volte perché Oracle sceglie di eseguire il rollback e rieseguire tutto o parte di un INSERT dichiarazione al fine di mantenere la coerenza della scrittura.

In genere ti verrà servito molto meglio con un processo di database che cerca periodicamente le righe che devono ricevere un'e-mail, invia le e-mail e quindi aggiorna la tabella. Puoi utilizzare il vecchio DBMS_JOB pacchetto o il più recente e sofisticato DBMS_SCHEDULER pacchetto. Qualcosa sulla falsariga di

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;

che è quindi programmato per l'esecuzione, diciamo, ogni 5 minuti (potresti anche usare il DBMS_SCHEDULER pacchetto)

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;

Puoi utilizzare il pacchetto UTL_MAIL per implementare send_email procedura. Probabilmente devi solo chiamare UTL_MAIL.SEND con i parametri appropriati (supponendo che tu abbia configurato il tuo SMTP_OUT_SERVER parametro e il tuo utente ha ottenuto l'accesso appropriato a UTL_MAIL pacchetto e a un ACL che consente di comunicare con quel server SMTP).