Подавить ошибки ORA-00942 в сценариях создания ddl - PullRequest
2 голосов
/ 03 октября 2010

Допустим, вы сгенерировали ddl для создания всех ваших таблиц db и т. Д. Через Hibernate SchemaExport и т. Д. В результате вы получаете скрипт, который начинается с операторов drop в начале. Не проблема, так как я этого хочу. Но выполнение этого скрипта приводит к дурацкой ошибке ORA-00942, работающей на базе данных Oracle.

Поскольку на самом деле они не являются ошибками, если таблиц еще не было, я бы хотел, чтобы мой сценарий создания был безошибочным при выполнении, поэтому легко определить, что (если таковое имеется) не удалось.

Какие у меня варианты? Я действительно хочу генерировать операторы отбрасывания, так как таблицы могут существовать или могут не существовать, но я не хочу, чтобы миллион ORA-ов возвращался ко мне, и я должен проверить (чтобы определить, являются ли они действительными ошибками) только потому, что это не могло бросить стол совершенно новый.

Ответы [ 2 ]

3 голосов
/ 04 октября 2010

"Скажем, вы сгенерировали ddl для создания всех ваших таблиц БД и т. Д. Через Hibernate SchemaExport и т. Д. В результате вы получаете скрипт, который начинается с операторов drop в начале. Не проблема, как я этого хочу. Но выполнение этогоСценарий выдает кучу ошибок ORA-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;

Будьте осторожны с этим.Это ядерный вариант, и он опустит каждую таблицу в вашей схеме.

1 голос
/ 03 октября 2010

Если вы получили скрипт операторов drop, и Hibernate не сделает этого за вас, оберните операторы DROP TABLE в IF, чтобы проверить, существует ли таблица перед ее удалением:

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