Privilegios en Oracle para extraer un fichero
Me he encontrado con el siguiente problema: necesito extraer ficheros binarios almacenados en Oracle. Para ello uso el comando «utl_file.fopen», podéis encontrar más información de cómo usarlo en este enlace.
El problema viene en los privilegios del esquema que estoy usando, el cual no tiene los suficientes. Se puede comprobar los privilegios mediante esta sentencia en el esquema de administración SYS:
-- Obtener todos los permisos para UTL_FILE
SELECT * FROM DBA_TAB_PRIVS WHERE TABLE_NAME='UTL_FILE';
Si en la columna «GRANTEE» no aparece el nombre de tu esquema entonces es que no tiene los permisos necesarios. Para otorgárselos deberás ejecutar este comando también en el esquema de administración:
-- Establece el permiso necesario en UTL_FILE para el esquema deseado
GRANT EXECUTE ON SYS.UTL_FILE TO <nombreEsquema>;
Sustituye «<nombreEsquema>» por el que estés utilizando.
Una vez realizado comprueba que ahora sí que aparece en la tabla «DBA_TAB_PRIVS» y podrás usarlo correctamente.
El paso siguiente en los permisos es darle accesibilidad al directorio de salida. El comando «utl_file.fopen» usa el nombre de un diccionario de los directorios predefinidos en Oracle. Podéis comprobar los directorios definidos mediante esta función:
-- Comprueba los directorios dados de alta
SELECT * FROM all_directories;
Si no aparece vuestro directorio de salida definido deberéis generarlo mediante el siguiente comando:
-- Crea el directorio en la tabla ALL_DIRECTORIES
CREATE DIRECTORY <identificadorDirectorio> AS '<rutaFisica>';
Donde «<identificadorDirectorio>» será el nombre con el que se conocerá al directorio desde el comando «utl_file.fopen», y «<rutaFisica>» será el directorio donde se guardarán los ficheros extraídos.
Una vez creado también hay que darle permisos de lectura/escritura a nuestro esquema, lo cual para ello se usará el siguiente comando:
-- Da los permisos de lectura y escritura al esquema indicado
GRANT READ,WRITE ON DIRECTORY <identificadorDirectorio> TO <nombreEsquema>;
Y para finalizar se comprobará que se han otorgado los privilegios de forma correcta mediante este comando:
-- Comprueba los privilegios del directorio
SELECT * FROM all_tab_privs WHERE table_name = '<identificadorDirectorio>';
Un saludo.