Verificando um banco de dados é como você espera que ele seja
-
20-08-2019 - |
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 ??p>
-
B:. O banco de dados tem todas as Tabelas I esperar e eles têm as colunas da direita ??p>
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.
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.
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.
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.