2012-04-23 10 views
0

表の特定の列が更新され、同じ表の別の列が更新された場合に、電子メールを送信するリンクまたはOracle DBトリガーの例を提供できますか?Oracle DB:電子メール・トリガーの提案

例: テーブルには複数の問題があり、2列「課題が追加されました」と「課題を追加しました」列はに更新される場合には「0」

Issue Added Email Sent 
    0    0 

に、デフォルトの「メール送信」があります " 1'

Issue Added Email Sent 
    1    0 

トリガーは、電子メールやアップデート列を送信します ''

Issue Added Email Sent 
    1    1 

答えて

1
送信されたメール

トリガーで電子メールを送信しようとするのは、一般的には悪い考えです。

  1. システムが電子メールを送信できない場合(たとえば、SMTPサーバーが一時的にダウンしているため)、トリガーは失敗し、トリガーするステートメントは失敗し、ロールバックされます。電子メールを送信できなかったため、基本的な取引を停止したいと思うことは非常にまれです。
  2. 電子メールを送信することはトランザクションではありません。これは決して決して犯されない変更の電子メールを送信することを意味します。また、書込みの一貫性を維持するために、INSERT文のすべてまたは一部をロールバックして再実行するため、電子メールを複数回送信します。

あなたは一般的にはるかに優れて定期的に送信される電子メールを持っている必要があります行を探しデータベース・ジョブを添えことでしょう、電子メールを送信し、テーブルを更新します。古いDBMS_JOBパッケージか、より洗練された新しいDBMS_SCHEDULERパッケージを使用できます。その後、実行するようにスケジュールされ

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; 

の線に沿って何かが、言って、5分ごとにsend_email手順を実装するためにあなたがUTL_MAIL packageを使用することができます

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; 

(あなたもDBMS_SCHEDULERパッケージを使用することができます) 。適切なパラメータを使用してUTL_MAIL.SENDに電話する必要があります(SMTP_OUT_SERVERパラメータを設定し、UTL_MAILパッケージとそのSMTPサーバーとの通信を許可するACLへの適切なアクセスが許可されていると仮定します)。

関連する問題