sql >> データベース >  >> RDS >> Oracle

Oracle DB:メールトリガーの提案

    通常、トリガーでメールを送信しようとするのはお勧めできません。

    <オール>
  1. システムが電子メールを送信できない場合 (SMTP サーバーが一時的にダウンしているなどの理由で)、トリガーは失敗し、トリガーステートメントは失敗してロールバックされます。メールを送信できなかったという理由だけで、基になるトランザクションを本当に停止したいということはほとんどありません。
  2. メールの送信は非トランザクションです。つまり、コミットされない変更についてメールを送信することになります。また、Oracle が INSERT のすべてまたは一部をロールバックして再実行することを選択するため、電子メールを複数回送信することになります。 書き込みの一貫性を維持するためのステートメント。
  3. 通常、電子メールを送信する必要がある行を定期的に検索し、電子メールを送信してから、テーブルを更新するデータベース ジョブを使用すると、はるかに優れたサービスが提供されます。古い 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 分ごとに実行されるようにスケジュールされます (DBMS_SCHEDULER を使用することもできます)。 パッケージ)

    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;
    

    UTL_MAIL パッケージ を使用できます send_email を実装する 手順。おそらく、UTL_MAIL.SEND を呼び出す必要があるだけです。 適切なパラメーターを使用して (SMTP_OUT_SERVER を構成したと仮定します) パラメータと、ユーザーは UTL_MAIL への適切なアクセスを許可されています パッケージと、その SMTP サーバーとの通信を可能にする ACL に追加します)。




    1. AzureDataStudioでSQLServerエージェントジョブを作成する

    2. このコマンドを実行すると、lsnrctlstartraneこのエラーが発生します

    3. varchar の月名を日付に変換して月順に並べる

    4. 2つのテーブルにまたがる内部結合を使用したPostgresの更新?