Suppress ORA-00942 Ошибки в DDL Создание сценариев
-
27-09-2019 - |
Вопрос
Скажем, вы генерируете DDL, чтобы создать все ваши таблицы DB и т. Д. через Hibernate SchemaExport и т. Д. То, что вы получаете, это скрипт, который начинается с выписки сброса в начале. Не проблема, как я хочу это. Но запуск этого скрипта производит черепную ошибку ORA-00942, работающую на Oracle DB.
Поскольку они на самом деле не на самом деле ошибки, если таблицы еще не существовали, я бы хотел, чтобы мой сценарий Create будет иметь ошибку, когда он выполняет, поэтому его легко определить.
Каковы мои варианты? Я хочу, чтобы заявления сброса сгенерированы с момента, поскольку таблицы могут еще не существовать, но я не хочу, чтобы миллион ORA-S возвращался на меня, что я должен проверить (чтобы определить, если они фактические ошибки) только потому, что это не может T Отбросьте стол, которая является совершенно новым.
Решение
Если вы получите скрипт выступлений сброса, и Hibernate не сделает это для вас, затем оберните операторы таблицы Drop в случае проверки, если таблица существует, прежде чем отбросить ее:
IF EXISTS(SELECT NULL
FROM TABLE_XYZ) THEN
DROP TABLE TABLE_XYZ;
END IF;
Другие советы
«Скажем, что вы генерируете DDL, чтобы создать все ваши таблицы DB и т. Д. Через Hibernate SchemaExport и т. Д. То, что вы получаете, это сценарий, который начинается с выписки сброса в начале. Не проблема, как я хочу это. Но запуск этого сценария производит крапруду ORA -00942 ошибки, работающие на Oracle DB. "
В идеале мы должны правильно поддерживать нашу схему, используя исходный контроль и лучшие практики управления конфигурацией. В этом сценарии мы заранее знаем, будь то схема, которую мы запустим наши сценарии против этих таблиц. Мы не получаем ошибки, потому что мы не пытаемся бросить таблицы, которые не существуют.
Однако это не всегда возможно сделать это. Один альтернативный подход - иметь два сценария. Первый скрипт просто имеет операторы капле в таблицу, предусматриваемые дружелюбным
PROMPT It is safe to ignore any ORA-00942 errors in the following statements
Второй скрипт имеет все заявления о создании таблиц и приводит к
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;
Будьте осторожны с этим. Это ядерный вариант и упадет на каждую таблицу в вашей схеме.