298


199

データベースをバージョン管理下に置きたい。 誰かが私を始めるために何かアドバイスや推奨記事を持っていますか?

少なくともそこには少なくともいくつかのデータがあることを望みます( alumbが言及したように:ユーザータイプと管理者)。 私はまたパフォーマンス測定のために生成されたテストデータの大量のコレクションが欲しいと思うでしょう。

29 Answer


174


Martin Fowlerがこの件に関して私のお気に入りの記事http://martinfowler.com/articles/evodb.htmlを書きました。 私は本番データベースをアップグレードする簡単な方法が欲しいので、_alumb_や他の人が示唆しているように、スキーマダンプをバージョン管理下に置かないことを選択します。

単一の本番データベースインスタンスがあるWebアプリケーションでは、2つの手法を使用します。

データベースアップグレードスクリプト

スキーマをバージョンNからN 1に移動するために必要なDDLを含むシーケンスデータベースアップグレードスクリプト。 (これらはあなたのバージョン管理システムに入ります。)_version_history_テーブル

テーブルVersionHistory(Version int主キー、UpgradeStart datetimeがnullではない、UpgradeEnd datetime)を作成します。

新しいバージョンに対応するアップグレードスクリプトが実行されるたびに新しいエントリを取得します。

これにより、どのバージョンのデータベーススキーマが存在するのかを簡単に確認でき、データベースアップグレードスクリプトは1回だけ実行されます。 繰り返しますが、これらはデータベースダンプではありません。 そうではなく、各スクリプトは、あるバージョンから次のバージョンに移動するために必要な*変更*を表しています。 それらは、「アップグレード」するために本番データベースに適用するスクリプトです。

開発者サンドボックス同期

  1. 運用データベースをバックアップ、サニタイズ、および縮小するためのスクリプト。 本番DBにアップグレードするたびにこれを実行します。

  2. 開発者のワークステーションでバックアップを復元(そして必要に応じて微調整)するためのスクリプト。 各開発者は、本番DBにアップグレードするたびにこのスクリプトを実行します。

_警告:私の自動テストは、スキーマは正しいが空のデータベースに対して実行されるため、このアドバイスはあなたのニーズに完全には適していません。


46


Red GateのSQL Compare製品は、オブジェクトレベルでの比較やそれからの変更スクリプトの生成を可能にするだけでなく、1つの[objectname] .sqlを作成して、データベースオブジェクトをオブジェクトタイプ別のフォルダ階層にエクスポートすることもできます。これらのディレクトリ内のオブジェクトごとのスクリプト。 オブジェクト型の階層は次のようになります。

\機能\セキュリティ\セキュリティ\ロール\セキュリティ\スキーマ\セキュリティ\ユーザー\ストアドプロシージャ\テーブル

変更後にスクリプトを同じルートディレクトリにダンプした場合は、これを使用してSVNリポジトリを更新し、各オブジェクトの実行履歴を個別に保存することができます。


40


これは開発を取り巻く「難しい問題」の1つです。 私の知る限りでは完璧な解決策はありません。

データではなくデータベース構造のみを格納する必要がある場合は、データベースをSQLクエリとしてエクスポートできます。 (Enterprise Managerの場合:データベースを右クリック - > SQLスクリプトの生成。 オプションタブで「オブジェクトごとに1つのファイルを作成する」を設定することをお勧めします。その後、これらのテキストファイルをsvnにコミットし、svnのdiffおよびlogging機能を利用することができます。

私はこれをいくつかのパラメータを取り、データベースを設定するBatchスクリプトと結び付けました。 また、ユーザータイプや管理ユーザーなどのデフォルトデータを入力するクエリを追加しました。 (もっと詳しい情報が欲しいなら、何か投稿してください。スクリプトをどこかアクセス可能な場所に置くことができます)

すべてのデータも保存する必要がある場合は、データベースのバックアップを取って、Redgate(http://www.red-gate.com/)製品を使用して比較することをお勧めします。 彼らは安く来ませんが、彼らはあらゆるペニーの価値があります。


38


まず、あなたにぴったりのバージョン管理システムを選ぶ必要があります。

  • 一元管理されたバージョン管理システム - ユーザーがファイルを操作する前後にチェックアウト/チェックインし、ファイルが単一の中央サーバーに保存される標準システム

  • 分散バージョン管理システム - リポジトリのクローンを作成するシステム。各クローンは実際にはリポジトリのフルバックアップなので、いずれかのサーバーがクラッシュした場合は、クローン作成されたリポジトリを使用して復元できます。すべてのバージョン管理システムの中核となるリポジトリをセットアップする必要があります。これについては、次の記事で説明します。http://solutioncenter.apexsql.com/sql-server-source-control-part-i-understandingソース管理の基本/

リポジトリを設定した後、そして中央のバージョン管理システムの場合は作業フォルダを、あなたは この記事を読むことができます。 開発環境でソース管理を設定する方法を示します。

  • MSSCCIプロバイダ経由のSQL Server Management Studio

  • Visual StudioとSQL Serverのデータツール

  • サードパーティ製ツールApexSQLソース管理


24


Red Gateでは、 SQL Source Controlというツールを提供しています。このツールは、SQL Compareテクノロジを使用してデータベースをTFSまたはSVNリポジトリにリンクします。 このツールはSSMSに統合されており、オブジェクトをコミットできるようになった以外は通常どおりに作業できます。

マイグレーションベースのアプローチ(自動デプロイメントに適しています)については、 SQL Change Automation(以前はReadyRollと呼ばれていました)を提供しています。一連の増分スクリプトをVisual Studioプロジェクトとして管理します。

SQLソース管理では、静的データテーブルを指定することができます。 これらはINSERTステートメントとしてソース管理に格納されます。

テストデータについて話しているのであれば、ツールを使用して、または定義した展開後スクリプトを使用してテストデータを生成するか、単に運用環境のバックアップを開発環境に復元することをお勧めします。


21


あなたはLiquibase(http://www.liquibase.org/)を見たいと思うかもしれません。 このツール自体を使用しなくても、データベース変更管理やリファクタリングの概念をうまく処理できます。


18


RedGateツールを推薦しているすべての人のための1、追加の推薦と警告付き。

SqlCompareにはきちんと文書化されたAPIもあります。たとえば、チェックイン時にソース管理されたスクリプトフォルダをCI統合テストデータベースと同期するコンソールアプリケーションを作成して、誰かが自分のスクリプトフォルダからスキーマへの変更をチェックインするとき対応するアプリケーションコードの変更とともに自動的にデプロイされます。 これは、ローカルデータベースの変更を共有開発DBに伝播することを忘れている開発者とのギャップを埋めるのに役立ちます(私たちの約半分、私は思います:))。

注意点は、スクリプト化されたソリューションやその他の方法では、RedGateツールが十分に滑らかであるため、抽象化の基礎となるSQLの現実について忘れるのは簡単だということです。 テーブル内のすべての列の名前を変更すると、SqlCompareは古い列を新しい列にマップする方法がなくなり、テーブル内のすべてのデータを削除します。 それは警告を生成しますが、私は人々がそれを過ぎてクリックするのを見ました。 ここに一般的な注意点がありますが、DBのバージョン管理とアップグレードはこれまでのところ自動化しかできないと思います。抽象化は非常に漏れやすいです。


15


VS 2010では、Databaseプロジェクトを使用してください。

  1. データベースをスクリプトアウトする

  2. スクリプトを変更するか、直接dbサーバーに変更を加えます。

  3. データ>スキーマ比較を使用して同期

完璧なDBバージョニングソリューションを作り、同期DBを簡単にします。


15


SQLデータベースの管理には DBGhostを使用します。 それからあなたのスクリプトをあなたのバージョン管理の中に新しいデータベースを構築するために入れてください、そしてそれは新しいデータベースを構築するか、あるいはバージョン管理の中のスキーマに既存のデータベースをアップグレードするでしょう。 そうすれば、変更スクリプトの作成について心配する必要はありません(たとえば、列のデータ型を変更したい場合やデータを変換する必要がある場合でも、それを実行できます)。


13


変更スクリプトを使用してデータベーススクリプトをバージョン管理に保存して、あるデータベースをアップグレードできるようにするのは良い方法です。 また、すべての変更スクリプトを適用しなくても完全なデータベースを作成できるように、異なるバージョンのスキーマを保存することもできます。 手動で作業する必要がないように、スクリプトの処理は自動化する必要があります。

共有データベースを使わずに、開発者ごとに別々のデータベースを用意することが重要だと思います。 こうすることで、開発者は他の開発者とは独立してテストケースと開発フェーズを作成できます。

自動化ツールには、データベースメタデータを処理するための手段が必要です。これは、どのデータベースがどの開発状態にあり、どのテーブルにバージョン管理可能なデータが含まれているかなどを示します。