2012-09-25 10 views
5

私たちの環境内のデータベースは、2つの異なる環境/アプリケーションによって共有されています。 2つのアプリケーションのうち、最初の1つはAが頻繁に更新され、2つ目のアプリケーションBは頻繁に更新されないと言います。同じデータベースを使用する複数のアプリケーションからのストアドプロシージャコードの変更を処理する方法は?

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

どのようにこの状況を優雅に処理しますか?アプリケーションBから

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

しかし、C#コードがプロシージャを呼び出すときには、パラメータ値を渡すことになっています。新しいパラメータが追加された場合は、それが破損します。 呼び出しパラメータが見つからない場合は、C#またはSQL Serverから無視する必要がありますか?

私の研究のショー - 私が最初SPROCからパラメータのリストを取得し、その後をループにそのリストを使用してプロシージャを呼び出し、paramは存在するかどうかを確認することができます

  1. 。 アプリケーションAが新しいパラメータを追加しても、アプリケーションBによって自動的に処理されることがあります。 これは、C#のDeriveParametersまたはSQLクエリを使用してパラメータリストを取得できます。

  2. すべてのSPROCを変更して、CSVの形式でパラメータを取得します。それをSPROCで分割し、それに応じて使います。 これは何百もの既存のsprocsの色が変わってしまいます。私が言ったように

ここでも、 - これは良い解決策のように見えるdoesntのである、とあなたが似たような状況があった場合、どのように違ったあなたはそれを処理しているのでしょうか? フレームワークはありますか?このシナリオでどちらがうまくいくのか分かりません。

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

EDITは - 私は言い換えると、ここでもう少し詳細を提供してみましょう。

  1. アプリケーション/チームAはコードを変更しますが、DBは変更されずにC#コードのみが本番環境に展開されます。 これが相違点です。そして、DBコードは次のリリースでのみ使用されます。

  2. アプリケーション/チームBには最新のコードがありますが、DBの変更はまだ行われておらず、古いデータベースが使用されています。

+0

これまでに投稿された3つの回答によれば、問題は共有データベースであるため、解決策はデータベースを使用するアプリケーションではなくデータベースで行うのが最適です。 –

+0

あなたは最終的に他のチームと何をするかについての合意を手配しましたか? –

答えて

2

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

CREATE PROCEDURE xxx 

    @OldParam int 
    ,@NewParam int = 0 

AS 

    <etc> 

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

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


[追加]

可能長期的な解決策は、にバージョンシステムのいくつかの種類を追加することですデータベースが更新されるたびに更新されるデータベース。

  • アプリケーションが起動すると、このような場合は

    としてそのパラメータがバージョン間で異なり、あなたがチェックし、呼び出し時に適切にフォーマットする呼び出しがある場合、それは現在のバージョン

  • を取得バージョン< 3は、2つのパラメータ

エルスコールprocを1つのパラメータとPROCを呼び出します

これは時間の経過とともに追跡して維持するのが難しくて面倒ですが、同時にすべてのシステム(A、B、およびデータベース)を更新できない場合は、オプションが制限されます。

+0

ありがとうございます。しかし、上記の編集を確認してください。編集で述べたように、DBは更新されません。おそらくアプリケーションBのコード自体でこれを処理する必要があります。どのような提案ですか? – snakepitbean

2

多分、それぞれのアプリケーションが独自のストアドプロシージャセットを持つ可能性があります。息子はお互いを気にしません。

4

あなたはエスケナリオでアプリケーション全体を書き換えることができないので、私はすべてのアプリケーションのSPを複製し、別々のスキーマに入れたいと思います。

データベースにさまざまなユーザーを作成し、各アプリケーションを専用のユーザーでdbに接続させます。アプリケーションAのDBユーザー(役割)は、他のスキーマに属するSPを実行する権限を持たず、アプリケーションBのDBユーザーも同じである必要があります。

もちろん、接続文字列を変更するアプリケーション。

関連する問題