Configurar paquete UTL en Oracle - Jhoon Granados Santos

JhoonG

En este blogger encontraras información relevante sobre las nuevas tendencias en el ámbito tecnológico.

martes, 2 de agosto de 2016

Configurar paquete UTL en Oracle

Para usar paquetes UTL de la base de datos Oracle y poder enviar correo se deberá de tener en cuenta que los paquetes utl’s necesitan permisos especiales, estos permisos se llama ACL (Lista de control de acceso) en caso de que no tenga definidos estos permisos se encontrara con el siguiente error.

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



Para solucionar debemos de crear ACL en la base de datos, yo recomiendo conectarse como el usuario SYS pero también se puede ejecutar como usuario de tipo DBA. Una de estas situaciones es cuando intentamos enviar correo desde la base de datos.
Como prueba podemos ejecutar el siguiente código simple de envio de correo, si no tenemos permisos nos dará error.
DECLARE
  v_mailsever_host VARCHAR2(30) := 'usuario@miempresa.com.pe';
  v_mailsever_port PLS_INTEGER := 25;
  l_mail_conn      utl_smtp.connection;
BEGIN
  l_mail_conn := utl_smtp.open_connection(v_mailsever_host,
                                          v_mailsever_port);
END;
Error obtenido:
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at "SYS.UTL_TCP", line 17
ORA-06512: at "SYS.UTL_TCP", line 246
ORA-06512: at "SYS.UTL_SMTP", line 115
ORA-06512: at "SYS.UTL_SMTP", line 138
ORA-06512: at line 6
¿Cómo podemos crear la ACL y dar permisos al usuario para poder enviar correos?
Pues bien, lo podemos hacer de la siguiente forma, previamente nos conectamos con el usuario SYS y ejecutamos el siguiente Script para crear ACL.
BEGIN
  dbms_network_acl_admin.create_acl(acl         => 'envio_correos.xml',
                                    description => 'Envio de correos',
                                    principal   => 'USUARIODBA',
                                    is_grant    => TRUE,
                                    privilege   => 'connect',
                                    start_date  => systimestamp,
                                    end_date    => NULL);
  COMMIT;
END;
Con esto hemos creado una lista acceso para envió de correo y hemos dado permisos al usuario 'USUARIODBA' para poder usarla.
Ahora hay que definir el servidor de correo y puerto utilizado sobre la lista que anteriormente hemos creado
BEGIN
  dbms_network_acl_admin.assign_acl(acl        => 'envio_correos.xml',
                                    host       => 'mail.miempresa.com.pe',
                                    lower_port => 25,
                                    upper_port => NULL);
END;
Si quisiéramos añadir otro puerto, volveríamos a ejecutar el mismo código con otro puerto distinto
BEGIN
  dbms_network_acl_admin.assign_acl(acl        => 'envio_correos.xml',
                                    host       => 'mail.miempresa.com.pe',
                                    lower_port => 80,
                                    upper_port => NULL);
END;
Si quisiéramos que otro usuario tuviera permisos para poder enviar correos, simplemente ejecutaríamos este código con el usuario al que queramos dar permisos.
BEGIN
  dbms_network_acl_admin.add_privilege(acl       => 'envio_correos.xml',
                                       principal => 'USUARIO2',
                                       is_grant  => TRUE,
                                       privilege => 'connect');
END;
En caso que queramos eliminar el acl ejecutamos este código.
BEGIN
  dbms_network_acl_admin.drop_acl(acl => 'envio_correos.xml');
END;
En caso de que queramos ver qué permisos tenemos dados y qué listas hay creadas en nuestra base de datos, usaremos las siguientes consultas:
 SELECT *
  FROM dba_network_acls;

SELECT *
  FROM dba_network_acl_privileges;


Referencias bibliográficas.

No hay comentarios.:

Publicar un comentario