Подавить ошибки ORA-00942 в сценариях создания ddl
Скажем, вы генерируете ddl для создания всех ваших таблиц db и т. Д. Через Hibernate SchemaExport и т. Д. В результате вы получаете скрипт, который начинается с операторов drop в начале. Не проблема, так как я этого хочу. Но выполнение этого скрипта приводит к дурацкой ошибке ORA-00942, работающей на базе данных Oracle.
Поскольку на самом деле они не являются ошибками, если таблицы просто еще не существуют, я бы хотел, чтобы мой скрипт создания не содержал ошибок при его выполнении, поэтому легко определить, что (если таковое имеется) не удалось.
Какие у меня варианты? Я хочу, чтобы операторы отбрасывания генерировались, поскольку таблицы могут существовать или могут не существовать, но я не хочу, чтобы миллион ORA-ов возвращался ко мне, и я должен проверить (чтобы определить, являются ли они действительными ошибками) только потому, что это не могло не бросайте стол, который является совершенно новым.
2 ответа
Если вы получили скрипт операторов drop, и Hibernate не сделает этого за вас, оберните операторы DROP TABLE в IF, чтобы проверить, существует ли таблица перед ее удалением:
IF EXISTS(SELECT NULL
FROM TABLE_XYZ) THEN
DROP TABLE TABLE_XYZ;
END IF;
"Допустим, вы генерируете ddl для создания всех ваших таблиц db и т. Д. Через Hibernate SchemaExport и т. Д. В результате вы получаете скрипт, который начинается с операторов drop в начале. Не проблема, как я хочу. -00942 ошибок, работающих на базе данных Oracle. "
В идеале мы должны поддерживать нашу схему должным образом, используя лучшие практики управления исходным кодом и управления конфигурацией. В этом сценарии мы заранее знаем, содержит ли схема, к которой мы запускаем наши сценарии, эти таблицы. Мы не получаем ошибок, потому что мы не пытаемся удалить таблицы, которые не существуют.
Однако это не всегда возможно сделать. Один альтернативный подход состоит в том, чтобы иметь два сценария. Первый скрипт просто имеет операторы DROP TABLE, предваряемые дружественным
PROMPT It is safe to ignore any ORA-00942 errors in the following statements
Второй скрипт имеет все операторы CREATE TABLE и выводит
PROMPT All the statements in this script should succeed. So investigate any errors
Другой вариант - использовать словарь данных:
begin
for r in ( select table_name from user_tables )
loop
execute immediate 'drop table '||r.table_name
||' cascade constraints';
end loop;
end;
Будьте осторожны с этим. Это ядерный вариант, и он опустит каждую таблицу в вашей схеме.