2012-04-23 50 views
0

有人可以提供一個Oracle數據庫觸發器的鏈接或示例,如果表中的特定列得到更新併發送電子郵件並更新同一個表中的不同列?Oracle數據庫:對電子郵件觸發器的建議

例子: 一個表有多個問題,有兩列「問題補充」和「郵件發送」即默認爲「0」

Issue Added Email Sent 
    0    0 

當「問題增加了」列被更新爲「 1'

Issue Added Email Sent 
    1    0 

觸發發送電子郵件和更新列 '郵件發送'

Issue Added Email Sent 
    1    1 

回答

1

嘗試在觸發器中發送電子郵件通常不是個好主意。

  1. 如果系統無法發送電子郵件(例如,因爲SMTP服務器暫時關閉),觸發器將失敗,觸發語句將失敗並回滾。很少有人會因爲您無法發送電子郵件而想要停止基礎交易。
  2. 發送電子郵件是非事務性的。這意味着您將發送電子郵件以進行永不改變的更改。並且您將多次發送電子郵件,因爲Oracle選擇回滾並重新執行全部或部分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分鐘(你也可以使用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 package實施send_email程序。您可能只需使用適當的參數調用UTL_MAIL.SEND(假設您已配置了SMTP_OUT_SERVER參數,並且您的用戶已被授予對UTL_MAIL程序包的適當訪問權並且允許您與該SMTP服務器通信的ACL)。