5

私たちの環境のデータベースは、2 つの異なる環境/アプリケーションによって共有されています。2 つのアプリケーションのうち、最初のアプリケーション A は頻繁に更新されますが、2 番目のアプリケーション B はそれほど頻繁には更新されません。

したがって、ここでの状況は、アプリケーション A が新しいコード (主にストアド プロシージャ) で更新されると、別のチームによって更新され、あまり頻繁に更新されない 2 番目のアプリケーション B に影響を与えて破損することがあります。これは正しい処理方法ではなく、両方の環境を一緒に更新しないと悲惨なことになる可能性があることを理解しています。これは、アプリケーション A と B が異なるチームによって処理されているために発生しています。

この状況をどのようにエレガントに処理しますか?

アプリケーション B から私が取ることができる予防策は次のとおりです - コードでデータを取得する - データを取得する際の最善の方法は、アプリケーション A によって新しい列が追加された場合にアプリケーション B によって無視されるように、空白/null 列をチェックすることです。 SQL でのデータの取得 - プロシージャ内では、オプションのパラメーターを使用して処理できます。

しかし、C# コードがプロシージャを呼び出すときは、param 値を渡す必要があり、新しいパラメータが追加されると、それが壊れます。呼び出しパラメーターが欠落している場合、(C# または SQL Server から) 無視する必要があることを確認する方法はありますか?

私の調査によると -

  1. 最初に sproc からパラメーターのリストを取得し、そのリストを使用してプロシージャを呼び出してループし、パラメーターが存在するかどうかを確認できます。そのため、アプリケーション A が新しいパラメーターを追加した場合でも、アプリケーション B によって自動的に処理されます。これは、C# の DeriveParameters または SQL クエリを使用してパラメーター リストを取得することで実行できます。

  2. すべての SPROC を変更して、パラメーターを CSV 形式で受け取るようにします。SPROC でそれらを分割し、それに応じて使用します。これは、何百もの既存の sproc にとっては不十分に思えます。

繰り返しますが、私が言ったように、これは良い解決策とは思えません。もしあなたが同様の状況にあったとしたら、どのように異なった方法で対処したでしょうか? このシナリオを回避できるフレームワークはありますか?

環境 - ASP.NET/C# 4.0、SQL Server 2008 R2

編集 - 言い換えて、ここでもう少し詳細を説明しましょう。

  1. アプリケーション/チーム A はコードを変更しますが、DB の変更ではなく、C# コードのみが本番環境にロールアウトされます。ここが違いです。また、DB コードは次のリリースでのみ導入されます。

  2. アプリケーション/チーム B には最新のコードがありますが、DB の変更はまだ本番環境になく、まだ古いデータベースを使用しています。

4

3 に答える 3

2

新しいパラメータにデフォルト値を割り当てられない理由はありますか? 例えば

CREATE PROCEDURE xxx

   @OldParam   int
  ,@NewParam   int  = 0

AS

   <etc>

アプリケーション「A」は両方のパラメーターを渡します。

アプリケーション "B" は、proc にパラメーターが 1 つしかないときに作成され、重要な 1 つのパラメーターでのみ呼び出されます。新しいバージョンでは、2 番目のパラメーターが渡されないため、既定値の 0 が取得されます。手順は適切にコーディングされています。(NULL または特別なデフォルト値を使用して、古いシステムからの呼び出しに「フラグを立てる」ことができます。)


[追加した]

考えられる長期的な解決策は、データベースが更新されるたびに更新される、ある種のバージョン システムをデータベースに追加することです。

  • アプリケーションが起動すると、現在のバージョンが取得されます
  • バージョン間でパラメーターが異なる呼び出しがある場合は、次のように、呼び出し時に適切にチェックしてフォーマットします。

    バージョン < 3 の場合は、1 つのパラメーターを指定して proc を呼び出します

    それ以外の場合は、2 つのパラメーターを指定して proc を呼び出します

これは、時間の経過とともに追跡および維持するのが面倒で面倒ですが、すべてのシステム (A、B、およびデータベース) を同時に更新できない場合、選択肢は限られます。

于 2012-09-25T18:01:06.033 に答える
2

おそらく、各アプリケーションは独自の一連のストアド プロシージャを持つことができ、相互に干渉しません。

于 2012-09-25T18:05:05.563 に答える