web-dev-qa-db-ja.com

Oracleデータベースの変更をどのようにバージョン管理しますか?

テーブル定義の変更、新しいオブジェクト、パッケージの変更など、データベースに加えられた変更を追跡するために他の人が使用している方法を知りたいです。外部バージョン管理システムでフラットファイルを使用していますか?トリガー?他のソフトウェア?

32
Leigh Riffel

私が働いたサイトでは、本番インスタンスに加える必要のある変更は、SQL * Plusで実行される変更スクリプトとしてスクリプト化する必要があります。さらに、すべてのスキーマオブジェクトをゼロから再作成するために必要なスクリプトは、最新の状態に保つ必要があります。これらのスクリプトはすべて変更管理にチェックインされ、そこから移行されます。

DDLの変更を監査したり、DDLトリガーを使用して変更を取得したり、diffソフトウェアを使用して2つのインスタンスを比較したりできますが、これらの方法は無差別です。多くの場合、開発者は正確に何を変更する必要があるかを検討する前に、スキーマにいくつかの変更(たとえば、小さなテスト変更、概念をテストするためのダミーテーブルの作成など)を行って元に戻します。

22
Jeffrey Kemp

私はこのトピックについてたくさん考え、読みました。これは、構成制御と変更管理戦略の幅広いトピックです。 CMMIはこのトピックでドメインを持っています。 CMMI 3-5の認定を受けている企業であっても、データベースのバージョン管理を行わない場合があります。

この質問は、制約に留意しながら回答する必要があります。

  1. あなたにはキーパーがあり、すべてのDDLはこのキーパーによって実行されます。
  2. 他の人々はDDLステートメントを実行する能力を持っています。
  3. 行われた変更をログに記録するだけで済みますが、大きな違いを比較する必要はありません。
  4. データベースの設計は外部ツールを介して行われ、データベースに公開されます。この外部ツールは、ソース管理のDDLスクリプトでもかまいません。しかし重要な点は、これをソース管理してデータベースに公開することです。
  5. 瞬間的な変化を知る必要はありませんが、時々、つまり毎時、毎日を知る必要があります。
  6. サーバー構造が定義されています。開発、テスト、本番です。そして、優れたテスト戦略。

回答1

  • 1、4、6がtrueの場合、外部ソース管理を使用できます。例えば
    • Embercaderoにはデータベース変更管理ツールがあります( http://www.embarcadero.com/products/db-change-manager-xe )。データベース(Oracle)をリバースエンジニアリングして、ソース管理に配置する機能があります。その後、任意の数の開発者であるdbaがこのスキーマに到達し、変更を加えることができます。
    • Oracle SQL Designerはこのアプローチに似ています。
    • ソース管理(svn、Mercurialなど)にテーブルスクリプトを作成し、それらも同じように維持します。
    • http://www.liquibase.org は上記の自動化されたアプローチです。
    • DAL(データアクセスレイヤー)、DDL(テーブルの作成)ステートメントを生成するコードジェネレーターを作成しました。私たちはそれらにソース管理を置き、そこで維持しました。リキベースのような専用のソリューションの方がうまくいくと思います。

このアプローチは、6の場合にうまく機能します。DDLステートメント(これもコードです)をソース管理に入れ、それを保守します。十分な配慮なしに誰もテストサーバーと運用サーバーを変更することはありません。

短所は、なんらかの理由で運用サーバーまたはテストサーバーに変更を加えた場合、迅速なバグ修正、主キーの変更などです。その変更を開発サーバーにも適用する必要があります。実際のところ、開発サーバーはあなたの地面の真実です。他の方法ではありません。

これは非常に開発者指向のアプローチです。しかし、最初に新しいモジュールを開発するときは、それはかなりうまくいきます。

Answer 2-1と6がtrueの場合:

回答1と同様のアプローチは、開発サーバーの保守です。誰もがそれを変更します。更新するときよりも。データベース比較ツールを使用します。これらをスクリプトとして取得し、ソース管理下に置きます。

- Red Gate Schema Compare supports Oracle
- Embercadero has similar tool
- https://github.com/carbonfive/db-migration
- http://www.sumsoftsolutions.com/svco/ (I have not used this product but I believe it belongs to this category.)
- Rails Active Migration (http://www.Oracle.com/technetwork/articles/kern-Rails-migrations-100756.html)

回答1と回答2の違いは、回答1でデータベース全体のDDLステートメントを収集して格納することです。回答2では、変更のすべてのバージョンを保存する必要があります。

  1. 開始
  2. V1
  3. V2
  4. V3
  5. ...

列をテーブルに配置し、後でそれを削除する場合。スクリプトはこれをanswer2に表示しますが、answer1には最後のバージョンのみが表示されます。また、違いを確認するには、V2とV1を比較する必要があります。個人的には、スタートとV3、V1、V3を簡単に比較できるので、答え1の方が好きです。回答2では、すべての変更点を探す必要があります。また、回答2では、ソース管理のスクリプトは、ビッグバンで複雑なスクリプトになる傾向があります。情報を見つけるのは難しい。

Answer 33がtrueの場合。この状況では制約6がないことに注意してください。つまり、開発サーバー、テストサーバー、製品サーバーがありません。本番サーバーのみ。 DDLトリガーを使用して、行われた変更をログに記録できます。これは主に、人々がDDL許可を乱用しないようにするために使用されます。問題が発生した場合は、責任を負うことができます。これが機能するためには、すべての人が自分のユーザーアカウントに接続する必要があり、アプリケーションアカウントにはDDL付与が必要ありません。すべての開発者がアプリケーションアカウントを知っているので、それを使用できます。

Answer 43と5がある場合、この状況では制約6がないことに注意してください。つまり、開発、テスト、製品サーバー。本番サーバーのみ。変更を保存するトリガーの代わりに。外部ツールを使用して変更を検索し、DDLスクリプトをソース管理に保存します。

これらのツールに誰が変更を行ったかを記録する機能があれば、便利です。このソリューションでは、間隔を置いて実行される余分なDDLが失われることに注意してください。

10
Atilla Ozgur

Liquibase をバージョンOracleに使用することについての興味深いチュートリアルを見つけました。

6
Leigh Riffel

一部のデータベースでは、DDLトリガーを使用して変更をキャッチし、テーブルに保存しています。次に、これらの以前のバージョンをプルアップするためのWebインターフェイスがあります。これには重大な欠点があるため、別の方法を探していますが、簡単で、バージョン管理がないよりも優れています。

4
Leigh Riffel

11gデータベースには Schema Version Control を使用しましたが、11.2のソフトウェアにいくつかの問題がありました。私たちがまだ取り組んでいる問題がなければ、素晴らしい製品になります。

4
Leigh Riffel

以前はOracle SQL Designerを使用していましたが、(おそらく)現在SQL Developer Data Modelerに置き換えられています。 http://www.Oracle.com/technetwork/developer-tools/datamodeler/overview/index.html

それは非常に良かった、特に。列のドメインを設定し、共通の列(mtime、ctimeなど)を作成する時間を大幅に節約する機能。

2
Sebastian Roth

私たちは Oracle-ddl2svn ツールセット(私が作成者です)を使用して、SVNでのOracle DDLスキーマの自動保存を行います。

2
popalka

データベースによる変更管理 アプローチのDBmaestro TeamWorkをご覧ください。


開示:私はdbMaestroで働いています

0
Uri

私はそれを使ったことがありませんが、 http://blog.gitora.com/ は別のオプションです。

0
Leigh Riffel