データベースが期待どおりであることを確認する
-
20-08-2019 - |
質問
私は自分のマシンで Java アプリを作成しており、セットアップした DB を使用して完璧に動作しますが、サイトにインストールすると、DB がわずかに異なるために爆発してしまいます。
したがって、それを確認するためにいくつかのコードを書いているところです。
答え:DBの詳細は正しいです
B:データベースには私が期待するすべてのテーブルがあり、それらには適切な列があります。
A は完了しましたが、B をどこから始めればよいかわかりません。何か提案はありますか?
現在のクライアントのターゲット DB は Oracle ですが、アプリは SQL Server 上でも実行するように構成できます。したがって、一般的な解決策は歓迎されますが、一方を他方から実行する方法を理解できると確信しているため、必須ではありません。
解決
あなたはここで、データベースのINFORMATION_SCHEMAを照会したいと思うのOracleのためのいくつかの例では、私は似た何かを持っているのを認識していますすべてのプラットフォームです。
他のヒント
あなたはこのためにLiquiBaseをなどのデータベース移行ツールを使用することができるかもしれない - これらのツールのほとんどは、データベースをチェックするいくつかの方法があります。それは推測ですので、私はそれを使用して最初の手の経験を持っていない。
ほとんどの一般的な解決策は、select句が期待coulmnsを有し、かつ句からのtry catchブロック内では、テーブル名を持つクエリを実行することです。任意のデータを取得しないように、あなたは= 2 1としてwhere句を置くことができます。クエリは、例外をスローせずに実行した場合、あなたは、予想されるテーブルと列を持ってます。
若干異なる部分は、より良い最初の場所でのデータベースの作成をスクリプトによって処理される可能性があります。自動化されたプロセスは、次の2つが同じで作るのより良い機会を与えてくれます。
両方に同じデータベーススキーマとベンダー -もう一つのポイントの価値作りは、あなたのごdevlとのprod環境は同じにすることにより、リスクを最小限に抑えることです。 2が異なるような状況を変更します。
最後に、あなたは「少し」違うものを言うことはありませんが、時々、これらは、(例えばOracleはシーケンスを使用して、SQL Serverはアイデンティティを使用しています)避けられません。たぶん、Hibernateはあなたがより確実にベンダーを切り替えることができます。これは、データベースを変更すると、設定ファイル内の単一の値を変更することを意味することができるような方法で詳細を抽象化します。
あなたが持っている必要があり、何が基本的にデータベースのユニットテストです。 「カラムがFOOBARという名前の存在している必要があり、タイプは整数でなければなりません。外部キーは、など存在しないことがあります。」
これは、プレーンのJUnitとJDBCあなたが例えば使用するときに難しくなる可能性があるものを行われている絶対的に一定であることを確認することをお勧めしますと(そのメタデータのためのテーブルを尋ねる)でなんとかですDbUnitを。
は、Oracleでこれらのテーブルを使用するなど、テーブル、列、ビュー、の存在を確認することができます。
USER_TABLES USER_VIEWS USER_PROCEDURE
(またはすべてのため) USER_OBJECTS OBJECT_TYPE = '??'
タグテーブルのカラムのUSER_TAB_COLS ...続けるために
よろしく K
私はこのために MigrateDB のを使用しています。それはあなたが特定のデータベースのためなど特定のテーブル、列、行、インデックスの存在チェックのようなものを行うクエリを構築して、それらを使用することができます「テスト」。テストが失敗した場合、それは「アクション」トリガー(問題を解決する方法を知っているだけで、別のクエリです。)
MigrateDBは、複数のデータベース・プラットフォーム(あなたがたとえば、各プラットフォーム用の「テーブルの有無の問い合わせを確認する」を指定することもできます)、完全に設定のテストを(あなた自身を作ることができます)をサポートし、かなり完全なOracleのテストが付属しています、とすることができそれが唯一の違いが何であるかがわかりますように、「監査のみ」モードで実行します。
これは、素敵な、堅牢なソリューションです。
プレーンな JDBC を使用している場合は、次の方法を利用してみてください。 DatabaseMetadata.getTables およびメタデータ クラスで使用できる他の同様のメソッド。