Pergunta

Digamos que você gera DDL para criar todas as suas tabelas de banco de dados etc. via esquema de hibernato etc. O que você obtém é um script que começa com declarações de gota no início. Não é um problema, como eu quero isso. Mas a execução deste script produz uma série de erros de ORA-00942 em execução em um banco de dados Oracle.

Como eles não estão realmente erros se as tabelas ainda não existissem, gostaria que meu script crie sem erros quando for executado, para que seja fácil determinar o que (se houver) falhar.

Quais são minhas opções? Eu quero declarações de queda geradas, pois as tabelas podem ou não existir ainda, mas não quero um milhão de ora que volte a mim que tenho que verificar (para determinar se eles são erros reais) apenas porque não poderia t solte uma tabela que é nova em folha.

Foi útil?

Solução

Se você receber um script de declarações de gota, e o Hibernate não fará isso por você, envolva as instruções da tabela de gota em um IF para testar se a tabela existir antes de soltá -la:

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

Outras dicas

"Digamos que você gera DDL para criar todas as suas tabelas de banco de dados, etc por via hibernato schemaExport etc. O que você recebe é um script que começa com declarações de gota no início. Não é um problema, como eu quero isso. Mas executar esse script produz uma capload de ora -00942 Erros em execução em um DB Oracle. "

Idealmente, devemos manter nosso esquema corretamente, usando as melhores práticas de controle de fonte e gerenciamento de configurações. Nesse cenário, sabemos de antemão se o esquema contra o qual executamos nossos scripts contém essas tabelas. Não recebemos erros porque não tentamos soltar mesas que não existem.

No entanto, nem sempre é possível fazer isso. Uma abordagem alternativa é ter dois scripts. O primeiro script apenas tem as declarações da tabela de gota, precedida com um amistoso

PROMPT  It is safe to ignore any ORA-00942 errors in the following statements

O segundo script tem todas as declarações de tabela de criação e leva

PROMPT  All the statements in this script should succeed.  So investigate any errors

Outra opção é usar o dicionário de dados:

begin
    for r in ( select table_name from user_tables )
    loop
        execute immediate 'drop table '||r.table_name
                    ||' cascade constraints';
    end loop;
end;

Tenha cuidado com este. É a opção nuclear e soltará todas as tabela do seu esquema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top