Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle DB:Vorschlag für E-Mail-Trigger

Es wäre im Allgemeinen eine schlechte Idee, zu versuchen, eine E-Mail in einem Trigger zu senden.

  1. Wenn das System die E-Mail nicht senden kann (z. B. weil der SMTP-Server vorübergehend ausgefallen ist), schlägt der Trigger fehl und die auslösende Anweisung schlägt fehl und wird rückgängig gemacht. Es ist sehr selten, dass Sie die zugrunde liegende Transaktion wirklich stoppen möchten, nur weil Sie keine E-Mail senden konnten.
  2. Das Senden einer E-Mail ist nicht transaktional. Das bedeutet, dass Sie E-Mails für Änderungen senden, die nie festgeschrieben werden. Und Sie werden E-Mails mehrmals senden, weil Oracle sich dafür entscheidet, einen INSERT ganz oder teilweise zurückzusetzen und erneut auszuführen -Anweisung, um die Schreibkonsistenz aufrechtzuerhalten.

Im Allgemeinen sind Sie mit einem Datenbankjob viel besser bedient, der regelmäßig nach Zeilen sucht, die eine E-Mail senden müssen, die E-Mails sendet und dann die Tabelle aktualisiert. Sie können entweder den älteren DBMS_JOB verwenden Paket oder das neuere und ausgefeiltere DBMS_SCHEDULER Paket. Etwas in der Art von

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;

die dann so geplant ist, dass sie beispielsweise alle 5 Minuten ausgeführt wird (Sie könnten auch den DBMS_SCHEDULER verwenden Paket)

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;

Sie können das UTL_MAIL-Paket verwenden um den send_email zu implementieren Verfahren. Sie müssen wahrscheinlich nur UTL_MAIL.SEND aufrufen mit entsprechenden Parametern (vorausgesetzt, Sie haben Ihren SMTP_OUT_SERVER konfiguriert -Parameter und Ihrem Benutzer wurde entsprechender Zugriff auf UTL_MAIL gewährt Paket und an eine ACL, die es Ihnen ermöglicht, mit diesem SMTP-Server zu kommunizieren).