Oracle數據庫里發郵件


背景

    最近由於kettle在同步Oracle數據的時候,時不時會有數據丟失,為了避免數據丟失的時候我們不能及時發現,領導要求在數據庫里每天同步完數據之后,進行一次核對,並將核對結果通過郵件發送出來。並給出了一個Oracle發郵件的存儲過程。

    那個存儲過程確實寫的很精妙,但是由於測試內網環境沒有一個可以使用的郵箱服務器,所以最終程序沒有報語法錯誤,就上生產了,結果生產部署的時候遇到了各種問題,不過還好都及時解決了,在此特做一個問題解決的記錄。

0,發郵件功能的前置條件

a, 開發發郵件的代碼

b, 具有一個可以訪問DBMS、_NETWORK_ACL_ADMIN包的高權限用戶

c, 用高權限用戶給自己執行發郵件程序時候所用到的用戶進行ACL授權

d, 網絡上確保數據庫所在的機器與郵箱SMTP服務器連通

 

1,ORA-29278:SMTP 臨時性錯誤: 421 Service not available

原因:網絡問題,連不上SMTP服務器

解決辦法:檢查SMTP服務配置是否正常,網絡端口是否可正常訪問,SMTP服務器是否正常服務

注:檢查端口的指令

windows版:telnet ip port

Linux版:wget ip:port

或者ssh:如ssh -v -p port username@ip

-v代表打開調試模式,username可隨意指定

 

 

 

 

 

 

2,ORA-24247:網絡訪問被訪問控制列表(ACL)拒絕

原因:Oracle數據庫端缺少對執行發郵件動作的用戶進行相應的授權操作

解決辦法:在Oracle里用高權限用戶進行acl授權

 1 BEGIN
 2 
 3 --1.創建訪問控制列表(ACL)
 4 
 5   dbms_network_acl_admin.create_acl(acl         => 'email_server_permissions.xml',
 6 
 7                                     description => 'Enables network permissions for the e-mail server',
 8 
 9                                     principal   => 'oracle_user', --授權用戶,也即具體執行發郵件動作的Oracle數據庫用戶
10 
11                                     is_grant    => TRUE,
12 
13                                     privilege   => 'connect');
14 
15   --COMMIT;
16 
17   --2.將 ACL 與郵件服務器相關聯
18 
19   dbms_network_acl_admin.assign_acl(acl        => 'email_server_permissions.xml',--每次執行該串兒腳本的時候,這里需要保持住不一致
20 
21                                     host       => '*.*.*.*', --主機名要做ip映射;SMTP服務器地址,這里要和調用的時候保持一致,我在具體實際中選用的ip,調用的時候只能用ip,用域名會報錯
22 
23                                     lower_port => 25,
24 
25                                     upper_port => NULL);
26 
27   --COMMIT;
28 
29   --3.ACL 為用戶授與連接郵件服務器的權限
30 
31   dbms_network_acl_admin.add_privilege(acl       => 'email_server_permissions.xml',
32 
33                                        principal => 'oracle_user', --授權用戶
34 
35                                        is_grant  => TRUE,
36 
37                                        privilege => 'resolve');
38 
39   --COMMIT;
40 
41 END;

 3,PLS-00201:identifier 'XXX' must be declared

原因:執行上一步授權動作的用戶不具有訪問DBMS、_NETWORK_ACL_ADMIN包的權限

解決辦法:找一個高權限的用戶,給具體執行授權動作的用戶附上該包的訪問權限

grant execute on 包名 to 用戶名;

注:如果不是當前用戶:則調用要加名稱:如ZUO.Proc

如果是當前用戶:則直接調用即可:如Proc

 

4,ORA-44416: ACL無效:無法解析的主用戶‘mgrdb’

原因:用戶名大小寫問題,acl授權的時候,用戶名得大寫

解決辦法:在授權腳本中將用戶名大寫

 

參考鏈接:

https://blog.csdn.net/yuanyannan123/article/details/40182189

https://www.2cto.com/database/201404/290719.html

http://www.nazmulhuda.info/ora-44416-unresolved-principal

https://blog.csdn.net/u010678947/article/details/20702149

https://www.cnblogs.com/muhy/p/10567607.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM