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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top