Unterdrückt ORA-00942 Fehler in DDL-Scripts erstellen
-
27-09-2019 - |
Frage
Sagen Sie DDL generieren alle Ihre db Tabellen usw. über Hibernate Schema usw. zu erstellen Was man bekommt, ist ein Skript, das am Anfang mit Drop-Anweisungen beginnt. Kein Problem, wie ich das will. Aber dieses Skript ausgeführt wird produziert eine crapload von ORA-00942 Fehler auf einer Oracle-DB ausgeführt wird.
Da sie nicht wirklich Fehler sind, wenn die Tabellen nur noch nicht vorhanden sind, würde ich meinen wie Skript fehlerfrei sein, wenn er ausgeführt wird, so ist es einfach, zu bestimmen, was (wenn überhaupt) ist fehlgeschlagen.
Was sind meine Optionen? Ich will Drop-Anweisungen generiert, da Tabellen oder noch nicht vorhanden sein können, aber ich will nicht eine Million ORA-s bei mir zurückkommen, dass ich zu überprüfen (um festzustellen, ob sie tatsächliche Fehler), nur weil es couldn‘ t fällt eine Tabelle, die die Marke neu.
Lösung
Wenn Sie ein Skript von Drop-Anweisungen erhalten, und Hibernate wird es nicht für Sie tun dann die DROP TABLE-Anweisungen in einer IF-Test wickeln, wenn die Tabelle, bevor sie fallen vorhanden ist:
IF EXISTS(SELECT NULL
FROM TABLE_XYZ) THEN
DROP TABLE TABLE_XYZ;
END IF;
Andere Tipps
"Sagen Sie DDL generieren alle zu schaffen Ihre db Tabellen usw. über Hibernate Schema etc. Was man bekommt, ist ein Skript, das mit Tropfen beginnt Aussagen am Anfang. Kein Problem, da ich dies will. aber läuft Dieses Skript erzeugt eine crapload von ORA-00942-Fehler auf einem Oracle-Lauf db. "
Im Idealfall sollten wir unser Schema richtig halten, die Quellcodeverwaltung verwenden und Konfigurationsmanagement Best Practices. In diesem Szenario wissen wir vorher, ob das Schema wir unsere Skripte gegen enthält die Tabellen ausgeführt werden. Wir bekommen keine Fehler, weil wir Tabellen nicht fallen versuchen, die nicht existieren.
Allerdings ist es nicht immer möglich, dies zu tun. Ein alternativer Ansatz ist zwei Skripte zu haben. Das erste Skript hat nur die DROP TABLE-Anweisungen, mit einem freundlichen
voranPROMPT It is safe to ignore any ORA-00942 errors in the following statements
Das zweite Skript hat alle CREATE TABLE-Anweisungen und führt aus mit
PROMPT All the statements in this script should succeed. So investigate any errors
Eine andere Möglichkeit ist es, das Datenwörterbuch zu verwenden:
begin
for r in ( select table_name from user_tables )
loop
execute immediate 'drop table '||r.table_name
||' cascade constraints';
end loop;
end;
Seien Sie mit diesem vorsichtig. Es ist die nukleare Option und wird jede Tabelle in Ihrem Schema fällt.