La sentencia para crear un objeto directorio (objeto directorio) ‘CREATE DIRECTORY’. Un objeto directorio específica un alias para un directorio en el sistema de ficheros del servidor donde queramos acceder bien para leer o escribir archivos. De está manera podemos acceder de una forma sencilla a los archivos de sistema operativo donde tengamos nuestra base de datos Oracle.
Todos los directorios se crean en un solo espacio de nombres y no son propiedad de un esquema individual específico, para que un usuario pueda crear objetos directorio tiene que tener el privilegio de sistema CREATE ANY DIRECTORY.
Cuando se crea un objeto directorio, se le concede automáticamente los privilegios de objeto READ (lectura) y WRITE (escritura) sobre el objeto directorio, y se pueden otorgar estos mismos privilegios a otros usuarios y roles. El DBA puede otorgar estos privilegios a otros usuarios y roles.
El directorio del sistema operativo al que apunta el objeto directorio debe existir y debe tener los permisos de lectura o/y escritura necesarios para que el usuario de sistema operativo con el que hemos arrancado la base de datos, normalmente ‘oracle’, pueda escribir o/y leer en el directorio.
Los privilegios otorgados al objeto directorio se crean independientemente de los permisos definidos para el directorio del sistema operativo, y los dos pueden o no pueden corresponder exactamente. Por ejemplo, un usuario de la base de datos tiene concedido el privilegio de READ sobre un objeto directorio, pero el directorio de sistema operativo no tiene permiso de lectura definido para los procesos de base de datos de Oracle, esto último producirá un error ya que aunque el usuario puede usar el objeto directorio para lectura el directo del sistema operativo al que apunta el objeto directorio.
Sintaxis de la sentencia
CREATE [OR REPLACE] DIRECTORY 'nombre' AS 'ruta';
Ejemplo
Si la base de datos esta en un sistema operativo Unix o Linux.
SQL>CREATE DIRECTORY PRUEBA AS '/u01/oracle/file/log';
Si la base de datos esta en un sistema operativo Windows.
SQL>CREATE DIRECTORY PRUEBA AS 'd:\u01\oracle\file\log';
Administración
Si queremos otorgar privilegios a otros usuarios sobre el objeto directorio PRUEBA, lo haremos de la siguiente manera.
Privilegio de lectura para el usuario APLI sobre el objeto directorio PRUEBA,
GRANT READ ON DIRECTORY PRUEBA TO APLI;
Privilegio de escritura para el usuario APLI sobre el objeto directorio PRUEBA,
GRANT WRITE ON DIRECTORY PRUEBA TO APLI;
Para borrar un objeto directorio utilizamos la sentencia DROP DIRECTORY de la siguiente manera,
DROP DIRECTORY 'nombre';
SQL>DROP DIRECTORY PRUEBA;
El objeto directorio se borrara de la base de datos pero el directorio del sistema operativo no, el directorio del sistema operativo lo borraremos, si es necesario, desde el propio sistema operativo.
La vista dba_directories nos proporciona información sobre los objetos directorio que tenemos creados en la base de datos Oracle.
SQL> desc DBA_DIRECTORIES
Name Null? Type
------------------------------------------- ------------ -----------------------------
OWNER NOT NULL VARCHAR2(30)
DIRECTORY_NAME NOT NULL VARCHAR2(30)
DIRECTORY_PATH VARCHAR2(4000)
Recomendaciones
Cuando el uso de objetos directory se hace desde procedimientos almacenados o funciones tenemos que tener en cuenta que si el propietario del procedimiento almacenado o función es distinto al propietario de las tablas que vayamos a usar, será este último el que debe tener los privilegios de READ y/o WRITE sobre el objeto directorio y no el propietario del procedimiento almaceno o función.
¿Quieres saber más? "Como escribir o leer archivos con el paquete UTL_FILE en ORACLE"