あなたの目標を達成する方法はたくさんあるので、あなたの質問に対する唯一の最良の答えを見つけられるとは思えませんが、私たちのプロセスと、過去 10 年間にあなたがやってきたことから得たいくつかの洞察を共有できます。説明された。おそらく、彼らはあなたにとってうまくいく解決策を特定するのに役立つでしょう.
まず、クライアント データベースの更新は難しい問題です。ソフトウェアをインストールしてから、彼らがデータベースに何をしたのか、実際にはわかりません。私は、クライアントが独自のテーブル、ビュー、さらにはインデックスをシステム テーブルに追加するように依頼しました。最初からデータベースの状態を必ずしも把握しているとは限らないため、これらすべてがターゲット データベースをアップグレードするときに頭痛の種になる可能性があります。
第二に、データベースをアップグレードするためのインストーラーが最適だと当初考えていたように思います。その後、私はこの問題についてさらに考え始めました。私たちの場合、少なくとも DBA はフロントエンド ソフトウェアをアップグレードする側ではないことがよくありました。また、多くのクライアントから、サーバーに何かをインストールすることは最初の一歩ではないと聞いたので、振り出しに戻ります。
最終的に、アップグレード用のスクリプトと、DBA \ エンド ユーザーがサーバー \ データベースに接続してアップグレード プロセスを実行する機能を含む独自の実行可能ファイルを作成することにしました。
(私たちの場合、独自のビジネス インテリジェンスを含む多くの暗号化されたストアド プロシージャを使用しています。そのため、クライアントがスクリプトを利用できるようにするだけではありません。)
まだ行っていない場合は、データベースをソース管理に入れましょう! Visual Studio と Red-Gate はそれぞれ、これを容易にする製品を提供しています。私は両方を使用しており、特に好みはありませんが、あなたとあなたのチームが使い慣れているものを使用することをお勧めします.
更新を出荷するときは、ソース管理の最新バージョンのデータベースから以前のバージョンのデータベースへの差分を実行します。新しいオブジェクトと変更されたオブジェクトを探します。オブジェクトを削除することはほとんどありませんが、それも必要になる場合があります。
データベースで何が変更されたかがわかったら、必要な変更を実行するための冪等スクリプトを作成するために、変更のリストを非常に系統的に調べます。これは非常に面倒なプロセスですが、クライアントが簡単にアップグレードできるようにするのに役立ちます。基本的に、このプロセスで行うことは防御的プログラミングです。テーブル、ビュー、ストアド プロシージャ、関数などがデータベースに存在すると仮定するのではなく、まずアイテムが存在することを確認します。その場合、その DDL ステートメントを完全にスキップできる可能性があります。それ以外の場合は、オブジェクトを削除して再作成する必要がある場合があります。
明確にするために、テーブルを削除することはありませんが、オブジェクトが最新であることを確認するために、他のオブジェクトを削除して再作成することがよくあります。
スクリプトは、正しい順序で実行可能ファイル (内部で構築したソリューション) にパッケージ化されます (たとえば、テーブルとそのテーブルを参照するビューを追加する場合、ビューの前にテーブルを作成する必要があります)。
余談ですが、Red-Gate は現在、これを行うツールを提供していますが、私はまだ本番環境で個人的に使用していません。
アップデートが適切にパッケージ化されたことに満足したら、それを壊そうとします! あらゆる種類のバージョンのデータベースに対してテストを行います。非常に古いバージョン、何らかの方法で変更したデータベース、サポートするすべてのバージョンの SQL Server (2000、2005、2008、2012 など) でテストします。機能しない状況が見つかった場合は、機能するまでスクリプトを修正します。
また、データベース スキーマには、更新が実行された日時、実行者、およびその更新の一部であったオブジェクトを記録するために、更新モジュールが書き込むログ テーブルがあることにも言及する必要があります。これは、場合によってはトラブルシューティングに役立ちました。
私たちのユーティリティでは、スクリプトを実行する前にデータベースのバックアップを作成してアップグレードすることはありませんが、バックアップを作成することはできます。これをプロセスの一部として検討することをお勧めします。(私たちのドキュメンテーションはこれの重要性を強調しており、私たちが何年にもわたって協力してきたほとんどの DBA は自然にこれを行っているため、これをユーティリティに書き込む必要はないと感じました)。
データベース更新ユーティリティは、ソフトウェア更新プログラムと一緒にパッケージ化され、製品全体の別のコンポーネントとして配布されます。クライアント サイトのデータベースで適切な資格情報と権限を持つすべてのユーザーが実行できます。
このプロセスは何年にもわたってうまく機能してきましたが、新しいツールが市場に導入されたり、クライアントが経験したエラーに遭遇したりするたびに、改善を続けています。機能するプロセスを開発するには時間がかかる場合があるため、いつでも噛むことができる以上に噛まないようにしてください. 私たちにとって、データベースをソース管理に入れることが最大の鍵でした。私たちがそれをすると、物事は少しずつうまくいき始めました.