Pergunta

Eu tenho escrito um aplicativo java na minha máquina e ele funciona perfeitamente usando o DB eu configurar, mas quando eu instalá-lo no local ele explode porque o DB é um pouco diferente.

Então, eu estou no processo de escrever algum código para verificar se:

  • A: detalhes Eu tenho o DB correta

  • B:. O banco de dados tem todas as Tabelas I esperar e eles têm as colunas da direita

Eu tenho um para baixo, mas eu não tenho idéia por onde começar com B, alguma sugestão?

alvo DB é para o cliente atual é Oracle, mas o aplicativo pode ser configurado para ser executado no SQL Server também. Então uma solução genérica seria apreciada, mas não é nessisary como tenho certeza que eu posso descobrir como fazer um do outro.

Foi útil?

Solução

Você vai querer consultar o information_schema do banco de dados, aqui estão alguns exemplos para Oracle, todas as plataformas Estou ciente tem algo semelhante.

http://www.alberton.info/oracle_meta_info.html

Outras dicas

Você pode ser capaz de usar uma ferramenta de migração de banco de dados como LiquiBase para isso - a maioria dessas ferramentas tem alguma maneira de verificar o banco de dados. Eu não tenho experiência em primeira mão de usá-lo por isso é uma suposição.

Eu uso DbUnit para bancos de dados de teste. É uma solução baseada em Java, que integra bem com JUnit . É possível usá-lo com quase nenhum Java. Eu ainda não usou exatamente na mesma situação que você descreveu, mas deve estar perto o suficiente para o trabalho.

solução mais genérica seria para executar consultas com cláusula select ter os coulmns esperados e da cláusula de ter nomes de tabela, dentro do bloco try catch. Você pode colocar onde cláusula como 1 = 2, para não buscar os dados. Se consulta executada sem jogar exceção, então você tem a tabela e colunas esperado.

A peça ligeiramente diferente pode ser melhor tratada pelo script a criação do banco de dados em primeiro lugar. Um processo automatizado lhe dá uma melhor chance de fazer os dois idênticos.

Outro vale a pena fazer ponto é que você minimizar o risco, tornando seus ambientes devl e prod idêntico - mesmo esquema de banco de dados e fornecedor para ambos. Mudar as circunstâncias que fazem os dois diferente.

Por fim, você não diz o que é "ligeiramente" diferente, mas às vezes estes são inevitáveis ??(por exemplo, Oracle usa seqüências, SQL Server usa identidades). Talvez Hibernate pode ajudá-lo a alternar entre fornecedores de forma mais confiável. Ele abstrai detalhes de tal maneira a que a mudança de bancos de dados pode significar a modificação de um único valor em um arquivo de configuração.

O que você precisa ter é basicamente testes de unidade para seu banco de dados. "A coluna deve existir nomeado FOOBAR, o tipo deve ser Integer. Não há chaves estrangeiras podem existir etc."

Esta é factível com JUnit simples e JDBC (pergunte a mesa para a sua meta-dados), como você pode querer garantir que você está absolutamente certo de que está sendo feito o que pode ser mais difícil quando se utiliza, por exemplo, DbUnit.

Você pode verificar a presença de tabelas, colunas, vistas, etc. usando essas tabelas no Oracle

USER_TABLES USER_VIEWS USER_PROCEDURE

(ou para tudo) USER_OBJECTS ONDE OBJECT_TYPE = '??'

Para continuar ... USER_TAB_COLS para colunas da tabela

Saudações K

Eu uso MigrateDB para isso. Ele permite que você construa consultas que fazem coisas como verificar a existência de tabelas dadas, colunas, linhas, índices, etc. para um determinado banco de dados e utilizá-las como "testes". Se um teste falhar, ele aciona uma "ação" (que é apenas uma outra consulta que sabe como resolver o problema.)

MigrateDB suporta múltiplas plataformas de banco de dados (você pode especificar o "cheque de consulta de tabela existência" para cada plataforma, por exemplo), completamente testes configuráveis ??(você pode fazer seu próprio up), vem com testes da Oracle bastante completos, e pode ser executado em "auditoria única" modo de modo que só lhe diz quais são as diferenças.

É uma boa solução robusta.

Se você estiver usando plain JDBC, você deve tentar utilizar este método: DatabaseMetadata.getTables e outros métodos semelhantes disponíveis na classe de metadados.

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