Reprimir ORA-00942 errores en los scripts DDL crean
-
27-09-2019 - |
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.
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.