129

私はよく次の問題に遭遇します。

データベースに新しいテーブルまたは列を必要とするプロジェクトへのいくつかの変更に取り組んでいます。データベースを変更して作業を続けます。通常、ライブシステムで複製できるように、変更を書き留めることを覚えています。しかし、私は自分が何を変更したかを常に覚えているわけではなく、それを書き留めることを常に覚えているわけでもありません。

それで、私はライブシステムにプッシュし、大きな、明らかなエラーが発生しますNewColumnX

これがこの状況のベストプラクティスではない可能性があるという事実にもかかわらず、データベースのバージョン管理システムはありますか?特定のデータベーステクノロジについては気にしません。存在するかどうか知りたいだけです。それがMSSQLServerで動作する場合は、すばらしいです。

4

22 に答える 22

64

Ruby on Rails には、データベースを変更する簡単なスクリプトである移行の概念があります。

データベースのバージョンを上げるルール (列の追加など) とバージョンをダウングレードするルール (列の削除など) を含む移行ファイルを生成します。各移行には番号が付けられ、テーブルは現在のデータベース バージョンを追跡します。

移行するには、「 db :migrate」というコマンドを実行します。このコマンドは、バージョンを調べて必要なスクリプトを適用します。同様の方法で移行できます。

移行スクリプト自体はバージョン管理システムに保持されます。データベースを変更するたびに新しいスクリプトをチェックインし、開発者はそれを適用してローカル データベースを最新バージョンにすることができます。

于 2008-08-02T06:23:33.737 に答える
32

データベースを作成するためにソースファイルを使用するという点で、私は少し古風です。実際には、project-database.sql と project-updates.sql の 2 つのファイルがあります。1 つ目はスキーマと永続データ用で、2 つ目は変更用です。もちろん、どちらもソース管理下にあります。

データベースが変更されると、まず project-database.sql のメイン スキーマを更新し、次に関連情報を project-updates.sql にコピーします (ALTER TABLE ステートメントなど)。次に、更新を開発データベースに適用し、テストし、うまくいくまで繰り返します。次に、ファイルをチェックインし、再度テストして、本番環境に適用します。

また、私は通常、db - Config - に次のようなテーブルを持っています。

SQL

CREATE TABLE Config
(
    cfg_tag VARCHAR(50),
    cfg_value VARCHAR(100)
);

INSERT INTO Config(cfg_tag, cfg_value) VALUES
( 'db_version', '$Revision: $'),
( 'db_revision', '$Revision: $');

次に、更新セクションに次を追加します。

UPDATE Config SET cfg_value='$Revision: $' WHERE cfg_tag='db_revision';

データベースが再作成されたdb_versionときにのみ変更され、データベースがdb_revisionベースラインからどれだけ離れているかがわかります。

更新を個別のファイルに保存することもできますが、それらをまとめてマッシュアップし、カット アンド ペーストを使用して関連するセクションを抽出することにしました。$Revision 1.1 $ から ':' を削除して、それらをフリーズします。

于 2008-09-26T20:29:07.343 に答える
14

MyBatis (以前の iBatis) には、コマンド ラインで使用するためのスキーマ移行ツールがあります。Java で書かれていますが、どのプロジェクトでも使用できます。

優れたデータベース変更管理の実践を実現するには、いくつかの重要な目標を特定する必要があります。したがって、MyBatis Schema Migration System (略して MyBatis Migrations) は次のことを目指しています。

  • 新規または既存の任意のデータベースで作業する
  • ソース管理システム (Subversion など) を活用する
  • 並行開発者またはチームが独立して作業できるようにする
  • 競合を非常に目立たせ、簡単に管理できるようにする
  • 順方向および逆方向の移行を許可する (それぞれ進化、進化)
  • データベースの現在のステータスに簡単にアクセスして理解できるようにする
  • アクセス権限や官僚機構に関係なく移行を可能にする
  • あらゆる方法論で作業する
  • 優れた一貫した慣行を奨励する
于 2010-07-10T21:56:52.070 に答える
12

Redgate にはSQL Source Controlという製品があります。TFS、SVN、SourceGear Vault、Vault Pro、Mercurial、Perforce、および Git と統合されています。

于 2011-07-08T14:51:41.783 に答える
11

Java ベースであり、jdbc をサポートするほぼすべてのデータベースで動作するはずのオープン ソース ツールliquibaseについて誰も言及していないのは不思議です。Rails と比較すると、Ruby の代わりに xml を使用してスキーマの変更を実行します。ドメイン固有言語の xml は嫌いですが、xml の非常にクールな利点は、liquibase が次のような特定の操作をロールバックする方法を知っていることです。

<createTable tableName="USER"> 
   <column name="firstname" type="varchar(255)"/>
</createTable>

したがって、これを自分で処理する必要はありません

純粋な sql ステートメントまたはデータのインポートもサポートされています。

于 2010-07-10T21:26:04.217 に答える
10

ほとんどのデータベースエンジンは、データベースのファイルへのダンプをサポートする必要があります。とにかく、MySQLがそうすることは知っています。これは単なるテキストファイルになるので、Subversionやその他の使用するファイルに送信できます。ファイルに対してもdiffを実行するのは簡単です。

于 2008-08-02T01:56:51.573 に答える
10

SQL Server を使用している場合、Data Dude (別名 Visual Studio の Database Edition) に勝るものはありません。コツをつかめば、データベースのソース管理されたバージョンと本番環境のバージョンの間でスキーマを比較するのは簡単です。クリックするだけで、差分 DDL を生成できます。

MSDN には、非常に役立つ説明ビデオがあります。

DBMS_METADATA と Toad については知っていますが、誰かが Oracle 用の Data Dude を思いつくことができれば、人生は本当に素晴らしいものになるでしょう。

于 2008-09-10T19:49:15.843 に答える
9

オラクルパッケージDBMS_METADATAを見てください。

特に、次の方法が特に役立ちます。

  • DBMS_METADATA.GET_DDL
  • DBMS_METADATA.SET_TRANSFORM_PARAM
  • DBMS_METADATA.GET_GRANTED_DDL

それらがどのように機能するか(かなり自明)に慣れたら、これらのメソッドの結果をソース管理下に置くことができるテキストファイルにダンプする簡単なスクリプトを書くことができます。幸運を!

MSSQLにこれほど単純なものがあるかどうかはわかりません。

于 2008-09-01T20:57:01.673 に答える
9

バージョン管理で最初のテーブル作成ステートメントを作成してから、テーブル変更ステートメントを追加しますが、ファイルを編集しないでください。理想的には順番に名前を付けたファイルをさらに変更するか、「変更セット」として指定して、特定の展開のすべての変更を見つけることができます。

私が見ることができる最も難しい部分は、依存関係の追跡です。たとえば、特定のデプロイメントテーブルBは、テーブルAの前に更新する必要がある場合があります。

于 2008-08-31T11:25:21.103 に答える
9

Oracle の場合、私はToadを使用します。これは、スキーマを多数の個別のファイル (たとえば、テーブルごとに 1 つのファイル) にダンプできます。Perforce でこのコレクションを管理するスクリプトがいくつかありますが、ほぼすべてのリビジョン管理システムで簡単に実行できるはずです。

于 2008-08-02T06:05:04.770 に答える
8

All ArroundAutomationsのツールであるPLSQLDeveloperには、Visual Source Safeで問題なく動作する(ただし優れていない)リポジトリ用のプラグインがあります。

ウェブから:

バージョン管理プラグインは、PL / SQL DeveloperIDE>>とMicrosoftSCCインターフェイス仕様をサポートするバージョン管理システムとの緊密な統合を提供します。>>これには、Microsoft Visual SourceSafe、>> Merant PVCS、MKSSourceIntegrityなどの最も一般的なバージョン管理システムが含まれます。

http://www.allroundautomations.com/plsvcs.html

于 2008-09-17T15:50:33.847 に答える
8

私はこれを何年にもわたって繰り返し行ってきました-スキーマバージョンの管理(または管理しようとしています)。最善のアプローチは、使用しているツールによって異なります。Quest Softwareツール「SchemaManager」を入手できれば、体調は良好です。Oracleには、「スキーママネージャ」とも呼ばれる独自の劣ったツールがあります(かなり混乱しますか?)。これはお勧めしません。

自動化されたツールがなければ(Data Dudeに関する他のコメントを参照)、スクリプトとDDLファイルを直接使用することになります。アプローチを選び、それを文書化し、厳密にそれに従ってください。私はいつでもデータベースを再作成できるのが好きなので、データベース全体(DBAの場合)または開発者スキーマ(製品の場合)の完全なDDLエクスポートを使用することを好みます。 -開発モード)。

于 2008-09-15T15:01:05.603 に答える
8

コーディングと並行して db リリース スクリプトを作成し、SS のプロジェクト固有のセクションにリリース スクリプトを保持します。データベースの変更が必要なコードに変更を加えた場合は、同時にリリース スクリプトを更新します。リリース前に、クリーンな開発データベース (本番環境から構造をコピーしたもの) でリリース スクリプトを実行し、最終テストを行います。

于 2008-08-30T18:58:40.787 に答える
8

ER Studioを使用すると、データベース スキーマをツールにリバースして、ライブ データベースと比較することができます。

例: 開発スキーマを ER Studio にリバースします。それを本番環境と比較すると、すべての違いがリストされます。変更をスクリプト化することも、自動的にプッシュすることもできます。

ER Studio でスキーマを取得したら、作成スクリプトを保存するか、独自のバイナリとして保存してバージョン管理に保存できます。スキームの過去のバージョンに戻りたい場合は、チェックアウトしてデータベース プラットフォームにプッシュしてください。

于 2008-09-17T18:04:28.393 に答える
7

Ruckusing と呼ばれる PHP5 の「データベース移行フレームワーク」があります。私はそれを使用していませんが、はアイデアを示しています。言語を使用して必要に応じてデータベースを作成すると、ソースファイルを追跡するだけで済みます。

于 2008-08-02T07:48:56.107 に答える
4

Visual Studio でMicrosoft SQL Server Data Toolsを使用して、SQL Server プロジェクトの一部としてデータベース オブジェクトのスクリプトを生成できます。次に、Visual Studio に組み込まれているソース管理統合を使用して、スクリプトをソース管理に追加できます。また、SQL Server プロジェクトでは、コンパイラを使用してデータベース オブジェクトを検証し、配置スクリプトを生成して、既存のデータベースを更新したり、新しいデータベースを作成したりできます。

于 2014-12-22T11:58:25.810 に答える
4

MS Team System Database Editionを使用して、かなりの成功を収めています。TFS バージョン管理および Visual Studio と多かれ少なかれシームレスに統合され、ストアド プロシージャ、ビューなどを簡単に管理できます。競合の解決は骨の折れる作業ですが、完了するとバージョン履歴が完成します。その後、QA および本番環境への移行は非常に簡単です。

ただし、これはバージョン 1.0 の製品であり、いくつかの問題がないわけではありません。

于 2008-09-26T18:12:01.993 に答える
3

2つのアプローチのいずれかをお勧めします。まず、SybaseのPowerDesignerに投資します。EnterpriseEdition。これにより、物理データモデルなどを設計できます。ただし、モデルをチェックインできるリポジトリが付属しています。新しいチェックインはそれぞれ新しいバージョンにすることができ、任意のバージョンを他のバージョンと比較したり、その時点でデータベースにあるものと比較したりすることができます。次に、すべての違いのリストを表示し、移行する必要があるものを尋ねます…次に、それを行うためのスクリプトを作成します。安くはありませんが、2倍の値段でお買い得で、ROIは約6ヶ月です。

もう1つのアイデアは、DDL監査をオンにすることです(Oracleで機能します)。これにより、変更を加えるたびにテーブルが作成されます。データベースの変更を最後にprodに移動したタイムスタンプから現在の変更をクエリすると、実行したすべての順序付きリストが表示されます。createtablefooのようなゼロサム変更を排除するためのいくつかのwhere句。ドロップテーブルfooが続きます。そして、modスクリプトを簡単に作成できます。なぜ変更をウィキに保持するのか、それは作業の2倍です。データベースにそれらを追跡させます。

于 2008-09-26T17:53:42.597 に答える
3

Schema Compare for Oracle は、変更を Oracle データベースから別のデータベースに移行するために特別に設計されたツールです。ダウンロード リンクについては、以下の URL にアクセスしてください。このリンクでは、ソフトウェアを完全に機能する試用版として使用できます。

http://www.red-gate.com/Products/schema_compare_for_oracle/index.htm

于 2010-01-10T02:59:51.697 に答える
3

テーブル変更用の VCS がないため、wiki にログを記録しています。少なくとも、いつ、なぜ変更されたのかがわかります。誰もが行っているわけではなく、複数の製品バージョンを使用しているため、完璧にはほど遠いですが、何もないよりはましです。

于 2008-09-01T07:29:33.593 に答える
2

Ambler と Sadalage による "Refactoring Databases" と Ambler による "Agile Database Techniques" の 2 冊の本をお勧めします。

誰かが Rails Migrations について言及しました。Railsアプリケーション以外でも、うまく機能すると思います。Railsに移行中のSQL Serverを使用したASPアプリケーションでそれらを使用しました。移行スクリプト自体を VCS にチェックインします。これは、Pragmatic Dave Thomas によるこの件に関する投稿です。

于 2008-09-22T18:17:48.637 に答える