132

SQL デルタをどのように準備しますか? スキーマを変更する各 SQL を手動でデルタ フォルダーに保存しますか、それとも何らかの自動化された差分プロセスがありますか?

ソース コードと共にデータベース スキーマをバージョン管理するための規則に興味があります。おそらく、スキーマを差分化する pre-commit フックでしょうか?

また、 DbDeploy 以外にデルタを比較するためのオプションはあります?

編集:答えを見て、デルタを使用してデータベース移行を実行するための標準的なスキームに精通していることを明確にしたいと思います。私の質問は、できれば自動的に、デルタ自体を作成することです。

また、バージョニングは、違いがある場合は PHP と MySQL 用です。(Ruby ソリューションはありません)。

4

16 に答える 16

62

見る

データベース構造を変更するためのバージョン管理システムはありますか?

SVN で MS SQL データベースをバージョン管理するにはどうすればよいですか?

そしてジェフの記事

データベースをバージョン管理下に置く

私はあなたの痛みを感じています。より良い答えがあればいいのにと思います。これはあなたが探していたものに近いかもしれません。

DB スキーマの変更を追跡するメカニズム

一般的に、これには適切で受け入れられている解決策はないと感じており、この分野で独自の解決策を模索しています。

于 2008-10-06T18:07:00.660 に答える
4

それでもオプションを探している場合:neXtepデザイナーをご覧ください。これは、バージョン管理の概念に基づいた無料のGPLデータベース開発環境です。この環境では、常にバージョン管理されたエンティティを操作し、データモデルの開発に集中できます。リリースが完了すると、バージョン管理システムに接続されたSQL生成エンジンは、2つのバージョン間で必要なデルタを生成でき、必要に応じて配信メカニズムを提供します。

特に、開発中にデータベースを同期および逆同期したり、データモデル図を作成したり、統合されたSQLクライアントを使用してデータベースにクエリを実行したりできます。

詳細については、wikiをご覧ください: http: //www.nextep-softwares.com/wiki

現在、Oracle、MySql、PostgreSqlをサポートしており、Javaであるため、製品はWindows、Linux、Macで動作します。

于 2010-10-25T05:06:03.640 に答える
4

別の同様のスレッドを参照してください: How do I version my MS SQL database in SVN? .

于 2008-10-06T18:08:07.193 に答える
3

スキーマの変更が常に追加されるようにします。したがって、列とテーブルは削除しません。データが失われ、後でロールバックできないからです。このようにして、データや機能を失うことなく、データベースを使用するコードをロールバックできます。

テーブルと列がまだ存在しない場合はそれらを作成し、それらにデータを入力するステートメントを含む移行スクリプトがあります。

移行スクリプトは、本番コードが更新されるたびに、および新規インストール後に実行されます。

何かを削除したい場合は、データベース インストール スクリプトと移行スクリプトからそれらを削除して、これらの古いスキーマ要素が新しいインストールで段階的に廃止されるようにします。新しいインストールでは、インストール前に古いバージョンにダウングレードできないという欠点があります。

そしてもちろん、これらのスクリプトを介して DDL を実行し、同期を保つためにデータベース上で直接実行することはありません。

于 2015-07-16T10:51:26.430 に答える
3

私はデルタを管理しません。マスター データベースに変更を加え、マスター データベースに基づいて XML ベースのビルド スクリプトを作成するツールを使用しています。

既存のデータベースをアップグレードするときが来たら、XML ベースのビルド スクリプトを使用して新しいデータベースとベア テーブルを作成するプログラムがあります。次に、INSERT INTO x SELECT FROM y を使用して古いデータベースからデータをコピーし、すべてのインデックス、制約、およびトリガーを適用します。

新しいテーブル、新しい列、削除された列はすべて自動的に処理され、コピー ルーチンを調整するためのいくつかの小さなトリックで、列の名前変更、列タイプの変更、およびその他の基本的なリファクタリングを処理できます。

大量のデータを含むデータベースではこのソリューションをお勧めしませんが、400 個のテーブルを含む 1 GB を超えるデータベースを定期的に更新しています。

于 2008-10-06T18:15:44.230 に答える
2

私は自分のホーンを宣伝する人ではありませんが、データベーススキーマへの変更を追跡し、バージョン管理された更新スクリプトを作成するための内部Webアプリを開発しました。

このツールはブラジルと呼ばれ、現在MITライセンスの下でオープンソースになっています。ブラジルはruby/ruby on railsベースであり、Ruby DBIがサポートする任意のデータベース(MySQL、ODBC、Oracle、Postgres、SQLite)への変更デプロイメントをサポートします。

更新スクリプトをバージョン管理に配置するためのサポートが計画されています。

于 2009-01-01T19:58:17.850 に答える
2

http://bitbucket.org/idler/mmp - PHP で記述された mysql 用のスキーマ バージョン管理ツール

于 2010-07-02T05:49:47.467 に答える
2

使用している RDBMS については言及されていませんが、MS SQL Server の場合、Red-Gate のSQL Compareは、オブジェクト作成スクリプト間のデルタを作成するために不可欠でした。

于 2008-10-06T18:20:06.110 に答える
1

私はほとんどの開発にFirebirdデータベースを使用しており、 FlameRobin管理ツールを使用しています。すべての変更をログに記録するための優れたオプションがあります。すべてを1つの大きなファイルに記録することも、データベースの変更ごとに1つのファイルに記録することもできます。この2番目のオプションを使用してから、各スクリプトをバージョン管理ソフトウェアに保存します。以前はSubversionを使用していましたが、現在はGitを使用しています。

FlameRobinがFirebirdに対して行うのと同じロギング機能を備えたMySQLツールを見つけることができると思います。

データベーステーブルの1つに、データベース構造のバージョン番号を格納しているので、任意のデータベースを簡単にアップグレードできます。また、任意のターゲットデータベースでこれらのSQLスクリプトを1つずつ実行する単純なPHPスクリプトを作成しました(データベースパスとユーザー名/パスワードはコマンドラインで指定されます)。

すべてのDML(挿入、更新削除)ステートメントをログに記録するオプションもあり、各データベースに含まれるいくつかの「デフォルト」データを変更しながらこれをアクティブにします。

私はこれらすべてをどのように詳細に行うかについての素敵なホワイトペーパーを書きました。デモPHPスクリプトと一緒に.pdf形式の論文をここからダウンロードできます。

于 2008-10-06T19:48:01.517 に答える
1

数か月前、MySQL スキーマのバージョン管理ツールを検索しました。Doctrine 移行、RoR 移行、Java や Python で書かれたいくつかのツールなど、多くの便利なツールを見つけました。

しかし、どれも私の要求を満たしていませんでした。

私の要件:

  1. 要件なし、PHP と MySQL を除く
  2. Doctrine の schema.yml のようなスキーマ設定ファイルはありません
  3. アプリケーションの他のインストールで同一のスキーマを表すよりも、接続から現在のスキーマを読み取り、新しい移行スクリプトを作成できます。

移行ツールの作成を開始し、今日ベータ版を入手しました。

このトピックに興味がある場合は、試してみてください。今後のリクエストとバグレポートを送ってください。

ソース コード: bitbucket.org/idler/mmp/src 英語の概要: bitbucket.org/idler/mmp/wiki/Home ロシア語の概要: antonoff.info/development/mysql-migration-with-php-project

于 2010-07-07T21:31:42.570 に答える
1

私もこの話題に興味があります。

Django wiki には、このトピックに関するいくつかの議論があります。

興味深いことに、CakePHP にはcake schema generateコマンドだけでスキーマのバージョン管理が組み込まれているようです。

于 2008-10-06T18:51:55.123 に答える
1

データベース スキーマの厳密なバージョン管理を使用しています (別の表で追跡)。スクリプトはバージョン管理に保存されますが、変更を行う前に現在のスキーマ バージョンを確認します。

SQL Server の完全な実装を次に示します (必要に応じて、MySQL 用に同じソリューションを開発できます): SQL Server データベース スキーマ バージョンを維持する方法

于 2013-07-17T21:55:33.123 に答える
1

http://code.google.com/p/oracle-ddl2svn/を使用します

于 2011-11-18T16:18:39.133 に答える
1

また、開発者が deltasql スクリプトを中央リポジトリに送信できる一連の PHP スクリプトも開発しました。

データベース テーブルの 1 つ (TBSYNCHRONIZE と呼ばれる) に、最後に実行されたスクリプトのバージョン番号を保存します。これにより、Web インターフェイスまたは Eclipse 用に特別に開発されたクライアントを使用して、任意のデータベースを簡単にアップグレードできます。

Web インターフェイスにより、複数のプロジェクトを管理できます。データベースの「ブランチ」にも対応しています。

http://www.gpu-grid.net/deltasqlでアプリケーションをテストできます(パスワード testdbsync を使用して管理者としてログインした場合)。このアプリケーションはオープン ソースで、 http ://sourceforge.net/projects/deltasql からダウンロードできます。

deltasql は、スイスとインドで生産的に使用されており、日本でも人気があります。

于 2009-01-29T13:26:54.480 に答える
1

MySQL の場合

新しいDBに着陸すると:

まず、構造を確認します。

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

stackoverflow ユーザーのおかげで、この簡単なスクリプトを記述して構造の違いを見つけることができました。

ソース: https://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531

2 番目のステップでは、テーブルごとにデータをチェックしますmysqldiff。少し古風ですが、データに基づくphpループはinformation_schema確実に機能します

バージョン管理についても同じ方法を使用しますが、(アップグレードまたはロールバックするための) SQL 更新スクリプトを diff 結果でフォーマットし、バージョン番号規則を使用します(いくつかの変更により、バージョン番号は IP アドレスのように見えます)

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------
于 2016-09-06T07:54:29.413 に答える
1

(ツールチェーンを使用して) データを移植可能な形式にエクスポートしてから、新しいスキーマにインポートします。デルタ SQL は必要ありません。強くお勧めします。

于 2008-10-06T18:07:56.757 に答える