J'ai mis en place un simple test de table externe Oracle que je ne peux pas mettre au travail (avec un administrateur DBA et Unix).
Ce qui suit est basé sur/ Concepts de tables externes . La base de données utilisée est 11g.
Voici la définition de la table externe:
drop table emp_load;
CREATE TABLE emp_load
(employee_number CHAR(5),
employee_dob DATE,
employee_last_name CHAR(20),
employee_first_name CHAR(15),
employee_middle_name CHAR(15),
employee_hire_date DATE)
ORGANIZATION EXTERNAL
(TYPE Oracle_LOADER
DEFAULT DIRECTORY defaultdir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
FIELDS (employee_number CHAR(2),
employee_dob CHAR(20),
employee_last_name CHAR(18),
employee_first_name CHAR(11),
employee_middle_name CHAR(11),
employee_hire_date CHAR(10) date_format DATE mask "mm/dd/yyyy"
)
)
LOCATION ('external_table_test.dat')
);
Voici le contenu de "external_table_test.dat":
56november, 15, 1980 baker mary alice 09/01/2004
87december, 20, 1970 roper Lisa marie 01/01/1999
Je suis capable d'exécuter le script qui crée "emp_load" sans aucun problème. Je peux aussi décrire la table bien. Lorsque je tente "select * from emp_load", j'obtiens les erreurs suivantes:
SQL> select * from emp_load;
select * from emp_load
*
ERROR at line 1:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
error opening file /defaultdir/EMP_LOAD_29305.log
EDIT 1
Oracle dispose d’autorisations de lecture/écriture sur le répertoire.
EDIT 2
J'ai pu obtenir cette erreur en utilisant la définition de table externe suivante:
CREATE TABLE emp_load
(employee_number CHAR(3),
employee_last_name CHAR(20),
employee_middle_name CHAR(15),
employee_first_name CHAR(15)
)
ORGANIZATION EXTERNAL
(TYPE Oracle_LOADER
DEFAULT DIRECTORY defaultdir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
BADFILE DHHSMAPSIS:'EMP.BAD'
LOGFILE DHHSMAPSIS:'EMP.LOG'
FIELDS TERMINATED BY ','
)
LOCATION ('external_table_test2.dat')
)
REJECT LIMIT UNLIMITED;
Mon fichier .dat ressemble à ceci ...
056,baker,beth,mary
057,smith,teddy,john
Je devais définir les autorisations sur "EMP.BAD", "EMP.LOG" & "external_table_test2.dat" sur 777 pour que cela fonctionne. L'utilisateur Oracle ne possède pas ces fichiers, mais appartient au même groupe que les fichiers.
Avez-vous une idée de la raison pour laquelle je ne parviens pas à faire fonctionner cela lorsque je définis les autorisations sur ces fichiers sur 770? Encore une fois, Oracle est dans le même groupe que ces fichiers, donc je me suis dit que 770 serait OK pour les permissions ...
Notre version d'Oracle s'exécute sur Red Hat Enterprise Linux. Nous avons expérimenté plusieurs types d'autorisations de groupe en vain. Le répertoire/defaultdir avait un groupe qui était un groupe secondaire pour l'utilisateur Oracle. Lorsque nous avons mis à jour le répertoire/defaultdir pour créer un groupe de "oinstall" (groupe principal d'Oracle), j'ai pu sélectionner des tables externes situées sous ce répertoire sans problème.
Ainsi, pour les autres personnes qui pourraient avoir ce problème, indiquez que le groupe principal d’Oracle est le groupe et qu’il pourra le résoudre comme vous l’avez fait. Nous avons pu définir les autorisations sur le répertoire et les fichiers sur 770 et la sélection sur les tables externes fonctionne correctement.
N'oubliez pas que c'est l'utilisateur qui exécute la base de données Oracle qui doit disposer des autorisations en écriture sur le répertoire/defaultdir, et non l'utilisateur connecté à Oracle. En règle générale, vous exécutez la base de données en tant qu'utilisateur "Oracle". Ce n'est pas le même utilisateur (nécessairement) que vous avez créé la table externe.
Vérifiez également les autorisations de votre répertoire.
Nous avons rencontré le même problème:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error error opening file /fs01/app/rms01/external/logs/SH_EXT_TAB_VGAG_DELIV_SCHED.log
Dans notre cas, nous avions un RAC avec 2 nœuds. Après avoir donné l’autorisation d’écriture sur le répertoire des journaux, des deux côtés , tout a bien fonctionné.
Nous avons eu cette erreur sur Oracle RAC 11g sous Windows et la solution consistait à créer la même arborescence de répertoires de système d'exploitation et le même fichier externe sur les deux nœuds.