8.4 - Les ‘ DIRECTORY ‘ Oracle

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