Erreurs ORA-suppress 00942 dans ddl créer des scripts
-
27-09-2019 - |
Question
Dites que vous générez ddl pour créer toutes vos tables db etc via Hibernate SchemaExport etc. Ce que vous obtenez est un script qui commence par des déclarations d'abandon au début. Pas un problème, comme je le veux. Mais l'exécution de ce script produit une crapload d'erreurs ORA-00942 en cours d'exécution sur un db Oracle.
Comme ils ne sont pas vraiment des erreurs si les tables juste n'existaient pas encore, je voudrais créer mon script pour être sans erreur lors de l'exécution de sorte qu'il est facile de déterminer quel (le cas échéant) a échoué.
Quelles sont mes options? Je ne veux instructions de suppression générés depuis les tables peuvent ou peuvent ne pas exister, mais je ne reviens me veulent pas un million ORA-s que je dois vérifier (pour déterminer si elles sont des erreurs réelles) juste parce qu'il couldn » t tomber une table qui est tout nouveau.
La solution
Si vous obtenez un script d'instructions de suppression et Hibernate ne le faire pour vous Enveloppez ensuite les instructions DROP TABLE dans un IF pour tester si la table existe avant la laisser tomber:
IF EXISTS(SELECT NULL
FROM TABLE_XYZ) THEN
DROP TABLE TABLE_XYZ;
END IF;
Autres conseils
"Dites que vous générez ddl pour créer tous vos tables db etc via Hibernate SchemaExport etc. Ce que vous obtenez est un script qui commencent par goutte déclarations au début. pas problème, comme je le veux. mais en cours d'exécution ce script produit un crapload de erreurs ORA-00942 en cours d'exécution sur un Oracle db. "
Idéalement, nous devrions maintenir notre schéma correctement, en utilisant le contrôle des sources et des meilleures pratiques de gestion de configuration. Dans ce scénario, nous savons à l'avance si le schéma que nous gérons nos scripts contre contient les tables. Nous ne recevons pas d'erreurs parce que nous ne tentons pas de supprimer des tables qui n'existent pas.
Cependant, il est pas toujours possible de le faire. Une autre approche est d'avoir deux scripts. Le premier script a juste les instructions DROP TABLE, préfacé par un match amical
PROMPT It is safe to ignore any ORA-00942 errors in the following statements
Le second script a toutes les instructions CREATE TABLE et débute avec
PROMPT All the statements in this script should succeed. So investigate any errors
Une autre option consiste à utiliser le dictionnaire de données:
begin
for r in ( select table_name from user_tables )
loop
execute immediate 'drop table '||r.table_name
||' cascade constraints';
end loop;
end;
Soyez prudent avec celui-ci. Il est l'option nucléaire et baissera toutes les tables dans votre schéma.