zoukankan      html  css  js  c++  java
  • Oracle11gR2下PL/SQL访问网络的错误ORA24247

    原有系统运行在10g下面,有很多程序是使用utl_smtp, utl_http等包进行网络访问。最近升级到11gR2之后,wait4friend 遇到ORA-24247错误。错误信息如下

    ORA-24247: network access denied by access control list (ACL)

    这是Oracle11g的一个安全特性,所有使用网络访问的用户都需要特殊的赋权。解决办法也挺简单,只需要建立一个ACL控制,并且设置相应的权限即可。

    -------------------------------------------------------------------
    --drop
    declare
      v_acl varchar2(100):= 'fxkz_alert.xml';
    begin
       dbms_network_acl_admin.drop_acl (acl => v_acl);
       commit;
    end;
    /

    -------------------------------------------------------------------
    -- 新建ACL并且设置地址
    declare
      v_user_name varchar2(30) := upper('test');
      v_acl       varchar2(100) := 'fxkz_alert.xml';
      v_privilege varchar2(30) := lower('connect');
    begin
      -- 新建acl
      dbms_network_acl_admin.create_acl(acl         => v_acl,
                                        description => '风险控制警报acl',
                                        principal   => v_user_name,
                                        is_grant    => true,
                                        privilege   => v_privilege,
                                        start_date  => null,
                                        end_date    => null);
      -- 赋予指定地址和端口的权限          
      -- 这里使用通配符代替如下地址和端口
      -- smtp.exmail.qq.com:25
      -- 221.236.20.139:8100                       
      dbms_network_acl_admin.assign_acl(acl        => v_acl,
                                        host       => '*',
                                        lower_port => 1,
                                        upper_port => 10000);
      commit;
    end;
    /

    设置之后可以通过视图检查设置的结果

    -------------------------------------------------------------------
    -- 检查配置情况
    select r.any_path from resource_view r where r.any_path like '/sys/acls/%.xml' order by 1;
    select a.host, a.lower_port, a.upper_port,a.acl, a.aclid from dba_network_acls  a where a.ACL='/sys/acls/fxkz_alert.xml';
    select p.* from dba_network_acl_privileges p;

    使用简单的代码也可以直接验证设置的用户权限是否生效

    -----------------------------------------------------------------
    -- 测试代码,必须使用被测试的用户执行
    declare
      v_conn utl_smtp.connection;
    begin
      v_conn := utl_smtp.open_connection('smtp.exmail.qq.com', 25);
    end;
    /

    declare
      v_http_url varchar2(300); --短信平台地址
      v_http_req utl_http.req; --http请求对象
    begin
      v_http_url := 'http://221.236.20.139:8100/sendsms/sms.do';
      v_http_req := utl_http.begin_request(v_http_url,
                                           'post',
                                           utl_http.http_version_1_1);
    end;
    /

    如果设置之后,还需要加入其他的用户,也很简单

    ------------------------------------------------------------------
    -- 加入额外的用户
    begin
      dbms_network_acl_admin.add_privilege(acl        => 'fxkz_alert.xml',
                                           principal  => upper('bill_src'),
                                           is_grant   => true,
                                           privilege  => 'connect',
                                           start_date => null,
                                           end_date   => null);
      commit;
    end;
    /

    本文参考了下列资料

    oracle11g新特性-安全性 发送邮件 报错ora-24247 解决方法
    作者:wait4friend
    Weibo:@wait4friend
    Twitter:@wait4friend
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Plugin with id 'com.android.application' not found.
    android studio ,Gradle DSL method not found: 'compile()'
    eclipse 插件未安装成功定位
    [转]jquery $(document).ready() 与window.onload的区别
    emmet
    前端
    qunit.js初试
    jquery-mockjax初试
    来自工程师的8项Web性能提升建议
    css 中两个class之间没有空格与有空格有什么区别
  • 原文地址:https://www.cnblogs.com/wait4friend/p/2800870.html
Copyright © 2011-2022 走看看