Les ‘DIRECTORY’ Oracle sont des objets Oracle qui servent d’interfaces entre la base de données et le système de fichiers du système hote.
Ils permettent notamment d’accéder à des fichiers physiques extérieurs à la base (tables externes, E/S en PLSQL, export/import datapump, etc.)..
En d’autres termes c’est un nom logique qui pointe sur un répertoire DU SERVEUR qui héberge la base (et pas du client bien sûr).
Syntaxe :
– pour creer une directory Oracle
SQL> CREATE [ OR REPLACE ] DIRECTORY ma_dir
AS ‘repertoire_du_serveur’;
– pour supprimer une directory
SQL> DROP DIRECTORY ma_dir;
Pour créer et supprimer une DIRECTORY il faut respectivement les droits SYSTEME :
CREATE ANY DIRECTORY ou DROP ANY DIRECTORY.
rem : il n’y a pas de controle de l’existence du répertoire physique ou des droits associés…
SQL> CREATE OR REPLACE DIRECTORY ma_dir AS ‘/n_importe_quoi’;
Directory created.
Informations dans dictionnaire
SQL> SELECT * FROM DBA_DIRECTORIES;OWNER DIRECTORY_NAME DIRECTORY_PATH ---------- ------------------------------ ------------------------------ SYS DATA_PUMP_DIR /oracle/10GDB/rdbms/log/ SYS TMP /tmp SYS ADMIN_DIR /oracle/10GDB/md/admin SYS DIR_TMP /work/oratmp SYS MA_DIR /n_importe_quoi
Droits sur les DIRECTORY
Comme on le voit sur l’écran précédent une DIRECTORY appartient toujours à SYS.
Donc c’est à priori SYS qui pourra gérer les droits des DIRECTORY même si c’est SYSTEM ou un autre user qui les a créées…
Pour pouvoir utiliser une directory, un utilisateur doit posséder des droits de lecture ou d’écriture dessus :
SQL> GRANT READ, WRITE ON DIRECTORY ma_dir TO scott;
Les droits peuvent être vérifiés dans le dictionnaire dans la table DBA_TAB_PRIVS ou ALL_TAB_PRIVS:
SQL> select grantee from dba_tab_privs
where table_name like ‘%MADIR%’;
GRANTEE
————
MARTIN
exemple de création et insertion dans un fichier en PL/SQL…via une DIRECTORY
On utilise le package standard UTL_FILE.
La fonction d’ouverture du fichier (ici en écriture) passe par une DIRECTORY.
C’est le premier paramètre de UTL_FILE.FOPEN…
SQL>
DECLARE
VFIC utl_file.file_type;
BEGIN
VFIC := UTL_FILE.FOPEN(’HDM_DIR’,'test.txt’,'W’);
UTL_FILE.PUTF(VFIC, ‘coucoun’);
utl_file.fclose(VFIC);
END;
/
Au niveau de l’OS l’utilisateur Oracle (propriétaire généralement des process Oracle) doit avoir les droits d’écriture dans le répertoire correspondants à la directory. Dans le cas contraire on récupère une erreur ORA-29283 :
ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at “SYS.UTL_FILE”, line 536
ORA-29283: invalid file operation
ORA-06512: at line 4