Pregunta

Decir que genera DDL para crear todas las tablas db, etc a través de Hibernate SchemaExport etc. Lo que se obtiene es un script que se inicia con las declaraciones de caída al principio. No es un problema, ya que quiero esto. Pero correr este script produce una crapload de ORA-00942 errores que se ejecutan en un db Oracle.

Dado que no son realmente errores si no existieran las tablas, sin embargo, me gustaría que mi script de creación de estar libre de error cuando se ejecuta por lo que es fácil determinar lo que (si lo hay) fallaron.

¿Cuáles son mis opciones? Deseo que los estados de caída generados desde tablas pueden o no existir todavía, pero no quieren un ORA-s posterior millones viene a mí que tengo que comprobar (para determinar si son errores reales) sólo porque no pudiste t deje caer una tabla que de nuevo.

¿Fue útil?

Solución

Si se obtiene una secuencia de comandos de las declaraciones de caída, e Hibernate no lo hará para usted entonces envolver el DROP TABLE en un SI a prueba si existe la tabla antes de caer él:

IF EXISTS(SELECT NULL 
            FROM TABLE_XYZ) THEN
  DROP TABLE TABLE_XYZ;
END IF;

Otros consejos

  

"Di que genera DDL para crear todos   sus tablas db, etc a través de Hibernate   SchemaExport etc. Lo que se obtiene es una   guión que comienza con la gota   declaraciones al principio. No un   problema, ya que quiero esto. pero correr   esta secuencia de comandos genera un crapload de   ORA-00942 errores que se ejecutan en un Oracle   db ".

Lo ideal es que debemos mantener nuestro esquema adecuadamente, utilizando control de código fuente y la gestión de la configuración mejores prácticas. En este escenario se sabe de antemano si el esquema en que manejamos nuestras secuencias de comandos contra contiene esas tablas. No conseguimos errores porque no intentamos eliminar tablas que no existen.

Sin embargo, no siempre es posible hacer esto. Un enfoque alternativo es tener dos guiones. El primer guión solo tiene las cuentas DROP TABLE, precedido de un amistoso

PROMPT  It is safe to ignore any ORA-00942 errors in the following statements

El segundo guión tiene todas las sentencias CREATE TABLE y clientes potenciales con

PROMPT  All the statements in this script should succeed.  So investigate any errors

Otra opción es utilizar el diccionario de datos:

begin
    for r in ( select table_name from user_tables )
    loop
        execute immediate 'drop table '||r.table_name
                    ||' cascade constraints';
    end loop;
end;

Tenga cuidado con éste. Es la opción nuclear y se reducirá cada mesa en su esquema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top