2017-10-12 9 views
2

私は大きなeshopのためのwotkingデータベース開発チームの一部です。私たちはMS SQL 2016とASP.NETを使用しています。 SQL Serverは、プロダクション環境で接続プーリング(aprox 7-10kバッチ/秒)を使用する10以上のIISサーバーからのクライアントによって使用され、18個のDEV/TESTING IISサーバーを使用しています(マルチTBサイズなので1つのDEVデータベースのみ)。 既存のストアドプロシージャを頻繁に変更する新しい機能を開発しました。どのように効果的なバージョンストア手順ですか?

本番環境に変更を展開する場合は、アプリケーションの変更とデータベースプロシージャの変更の両方を変更する作業の一部です。展開するときは、常に5つのIISサーバーに変更され、次に5つのIISサーバーに変更されます。その間、古いバージョンと新しいバージョンの両方がIISサーバー上に存在します。これらのバージョンは、データベース内のプロシージャを同時に使用している間、しばらく共存する必要があります。データベースレベルでは、プロシージャのいくつかのバージョンを使用してこの状況を解決します。古いバージョンのアプリケーションはEXEC dbo.GetProductを呼び出し、新しいアプリケーションバージョンはdbo.GetProduct_v2を使用します。新しいバージョンのアプリケーションをすべてのIISに配備すると、誰もがdbo.GetProduct_v2を使用しています。次回の展開では状況が逆転し、dbo.GetProductに新しいバージョンが含まれます。同様の状況が開発環境とテスト環境にあります。

私はこのソリューションが理想的ではなく、私はインスピレーションを受けたいと思います。

データ部分と論理部分を分けることを検討します。あるデータベースにはデータテーブルがあり、他のデータベースにはプロシージャやその他のプログラムオブジェクトのみが含まれます。新しいバージョンをデプロイするときは、ロジックを含むデータベース全体の新しいバージョンをデプロイするだけで、プロシージャのバージョンを作成する必要はありません。ロジックデータベースからのプロシージャは、データベースをデータでクエリします。 しかし、このソリューションの欠点は、他のデータベースでのクエリをサポートしていないため、来年使用する予定のネイティブなコンパイル済みプロシージャを使用できないことです。別のオプションは、1つのデータベースと異なるスキーマで別の手順のバージョンを使用している

...あなたが任意のアイデア、長所/短所を持っているか、あなたが私たちを支援し、管理することができますどのようなツールを知っていれば

は/展開/は、複数のprocバージョンを使用しますコメントしてください。私たちは、TFSやGitのを使用しているが、これはSQLデータベース内のプロシージャのバージョン管理を解決するものではない:

編集どうもありがとうございます。私の主な質問は、データベース内の複数のバージョンのプロシージャを使用して複数バージョンのIISアプリケーションを管理する必要性に対処する方法です。

+0

GITのようなソースリポジトリを調べましたか?他にも複数の選択肢がありますが、本当に投資したいものがあります。https://git-scm.com/ –

+0

誰かが質問をしたときに私を楽しませますが、その投稿はその質問に関する間違った情報を記載しています。 TFS/Gitは、適切なプロジェクトやツールを使用すれば、バージョン管理の問題を確実に解決できます。スキーマ比較を参照してください。 –

+0

あなたの究極の目標は何ですか? IISコードでSP参照を変更する必要はありませんか?そして、DBのSPバージョン管理だけを管理することができますか? – thomas

答えて

2

SSDTまたはSQLの比較とソースコントロールでバージョン管理が簡単です。展開も同様です。

問題はバージョン管理されていません。

同じ名前で、おそらく同じパラメータですが、コードが異なり、結果が異なる2つの異なるストアドプロシージャが必要です。あなたがポイントにオーバーロードを使用することができるので、例えば、.netコードで達成可能です。同じPROCの
2つのバージョンなければなら共存

あなたの問題はが異なるコードを使用して展開を段階的です。

あなたの場合、シノニムを使用して実際のストアドプロシージャ名をマスクすることを検討します。

これらのストアドプロシージャはあります。

  • dbo.GetProduct_v20170926(最後のリリース)
  • dbo.GetProduct_v20171012(このリリース)
  • dbo.GetProduct_v20171025(次のリリース)
  • dbo.GetProduct_v20171113(後1)

その後あなたは持っています

CREATE SYNONYMN dbo.GetProductBlue FOR dbo.GetProduct_v20171012; 
CREATE SYNONYMN dbo.GetProductGreen FOR dbo.GetProduct_v20170926; 

R異なるスキーマを使用して

DROP SYNONYMN dbo.GetProductGreen; 
CREATE SYNONYMN dbo.GetProductGreen FOR dbo.GetProduct_v20171113; 

そして... IISの展開がSYNONYMNsの1つの

次のリリースを参照してください

DROP SYNONYMN dbo.GetProductBlue; 
CREATE SYNONYMN dbo.GetProductBlue FOR dbo.GetProduct_v20171025; 

を段階的には同じ結果ですが、

で終わるだろう
- Blue.GetProduct 
- Green.GetProduct 

また、リリース日をスキーマ名にコーディングしてください。

- Codev20171025.GetProduct 
- Codev20171113.GetProduct 

は、あなたも、あなたがIISサーバーの別のセットを持っていた同じ問題を抱えているとサーバーの各セットに一つのコードベースを維持したい:

blue/green deployment model

+0

これらは、OPがすでに行っているのと同じように感じられます。抽象レイヤーが1つだけ追加されています( 'SYNONYMN')。私は違いを見逃している可能性があります。 – thomas

+0

@thomas:true、クライアントコードのAPIを安定させるだけで、どのバージョンが使用されているのかがはっきりわかります – gbn

1

カップルの仮定に基づいています。あなたの目標は、あなたのIISを変更することではありません

  • おそらくのApp.configファイルまたはWeb.configファイルとそのバージョン番号、あなたの.NETコードで参照することができます - あなたはどこかIISのコードでバージョン番号が持っている

    • リリースごとに.NET SP名が、それはSPのすべてのバージョンは、SPの同じパラメータ
    • 異なるバージョンが異なる結果

    を返すことができます取るDB

  • にSPの正しいバージョンを呼び出す必要がありウルDBに複数のバージョンのストアドプロシージャを持つことはまったくありません。アイデアは、IIS(私が推測している)からできるだけ遠ざかるように抽象化することです。

    上記に基づいて、バージョン番号(IISのWeb.configから得られる可能性が高い)を受け入れるSPに別のパラメータを追加できると考えています。

    ストアドプロシージャdbo.GetProductは、バージョン番号を取得し、残りのパラメータを適切な基盤SPに渡すことのみを目的とした「コントローラ」または「ルーティング」ストアドプロシージャになります。

    バージョンごとに1つのSPが必要です(任意の名前付け規則を使用してください)。そして、dbo.GetProductは、渡されたバージョン番号に基づいて適切なものを呼び出すでしょう。

    create proc dbo.GetProduct_v1 @Param1 int, @Param2 int 
    as 
    begin 
        --do whatever is needed for v1 
        select 1 
    end 
    
    go 
    
    create proc dbo.GetProduct_v2 @Param1 int, @Param2 int 
    as 
    begin 
        --do whatever is needed for v2 
        select 2 
    end 
    
    go 
    
    create proc dbo.GetProduct @VersionNumber int, @Param1 int, @Param2 int 
    as 
    begin 
        if @VersionNumber = 1 
        begin 
         exec dbo.GetProduct_v1 @Param1, @Param2 
        end 
    
        if @VersionNumber = 2 
        begin 
         exec dbo.GetProduct_v2 @Param1, @Param2 
        end 
    end 
    

    別の思考SP名をハードコーディング(Web.configファイルにバージョン番号に基づいて)動的にIISであなたのSPの名前を構築することの代わりになります。

  • 関連する問題