sql >> Database >  >> RDS >> Oracle

Oracle DB:suggestie voor e-mailtrigger

Het zou over het algemeen een slecht idee zijn om te proberen een e-mail te verzenden in een trigger.

  1. Als het systeem de e-mail niet kan verzenden (bijvoorbeeld omdat de SMTP-server tijdelijk niet beschikbaar is), mislukt de trigger en mislukt de triggerverklaring en wordt deze teruggedraaid. Het komt zelden voor dat u de onderliggende transactie echt wilt stoppen, simpelweg omdat u geen e-mail kunt verzenden.
  2. Het verzenden van een e-mail is niet-transactioneel. Dat betekent dat u e-mails verzendt voor wijzigingen die nooit worden vastgelegd. En u zult meerdere keren e-mails verzenden omdat Oracle ervoor kiest om een ​​INSERT geheel of gedeeltelijk terug te draaien en opnieuw uit te voeren statement om de schrijfconsistentie te behouden.

U bent over het algemeen veel beter af met een databasetaak die periodiek zoekt naar rijen waarvoor een e-mail moet worden verzonden, de e-mails verzendt en vervolgens de tabel bijwerkt. U kunt ofwel de oudere DBMS_JOB pakket of het nieuwere en meer geavanceerde DBMS_SCHEDULER pakket. Iets in de trant van

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 vervolgens, bijvoorbeeld, elke 5 minuten wordt uitgevoerd (u kunt ook de DBMS_SCHEDULER gebruiken pakket)

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;

U kunt het UTL_MAIL-pakket gebruiken om de send_email . te implementeren procedure. U hoeft waarschijnlijk alleen UTL_MAIL.SEND . te bellen met de juiste parameters (ervan uitgaande dat u uw SMTP_OUT_SERVER hebt geconfigureerd parameter en uw gebruiker heeft de juiste toegang gekregen tot de UTL_MAIL pakket en naar een ACL waarmee u kunt communiceren met die SMTP-server).




  1. cx orakel ImportError

  2. Back-up/herstel van een gedockte PostgreSQL-database

  3. Hoe de naam van een invoer door te geven via GET-verzoek in PHP

  4. MySQL, het kopiëren van tabellenbestanden geeft aanleiding tot ERROR 1017 (HY000):Kan bestand niet vinden:ook al is het daar