Configurar Base de Datos Oracle para utilizar paquete UTL´S
Para usar paquetes UTL de la base de datos Oracle se deberá de tener en cuenta que los paquetes utl’s necesitan permisos especiales, estos permisos se llama ACL (access control List) en caso de que no tenga definidos estos permisos se encontrara con el siguiente error.
1 |
ORA-24247: network access denied by access control list (ACL) |
Una de estas situaciones es cuando intentamos enviar correo desde la base de datos.
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
Como prueba podemos ejecutar el siguiente código simple de envio de correo, si no tenemos permisos nos dará error.
1 2 3 4 5 6 7 8 9 10 11 12 |
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; |
1 2 3 4 5 6 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 7 8 |
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 que otro usuario tuviera permisos para poder enviar correos, simplemente ejecutaríamos este código con el usuario al que queramos dar permisos.
1 2 3 4 5 6 7 8 |
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.
1 2 3 4 5 |
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:
1 2 |
SELECT * FROM dba_network_acls; |
1 2 |
SELECT * FROM dba_network_acl_privileges; |
Conclusiones
Con esta pequeña configuración en nuestra base de datos podremos enviar correos mediante un procedimiento almacenado.