2016-10-29 4 views
0

クライアントの場所でオフラインで動作するWinFormアプリケーション(C#)とBacked SQL Server 2008があります。現在、すべてのブランチは単一の場所から管理されていたため、ブランチ間では常にID列の値が一意です。異なるSQL Serverインスタンス間で一意のID列値を生成

ここでは、このアプリケーションを複数の場所から管理し、オフラインでもオンラインでも動作させる必要があります。可能にするために、私たちはPUBLIC IPにSQL Serverを配置し、各ブランチには別々のローカルSQL Serverインスタンスが実行されます。データは定期的にローカルサーバーと中央サーバーの間で同期されます。

この方法はデータを同期するのに適しているのですか、それとも私ができることがあるのですか?

私が上記のアプローチに踏み込んだ場合、私が直面する問題はデータを同期させることです。テーブル構造に問題があります。次のように私はテーブルのコースがあります。

  1. COURSE_IDがIDENTITY列
  2. COURSE_NAME標準
  3. COURSE_BRANCH_IDの名前はコースが取られた分岐を、表している
    COURSES (COURSE_ID (identity column), COURSE_NAME, COURSE_BRANCH_ID) 
    

これで、各SQL ServerはCOURSE_ID列の独自の値を生成しますが、これは異なるサーバーで同じである可能性があります。

  1. ユニークな組み合わせは、COURSE_IDCOURSE_BRANCH_IDです。
  2. COURSE_BRANCH_IDCOURSE_IDに追加する方法はありますか?新しいIDENTITY列を追加しないでください。私は

    1. 考え

    アプローチ

  3. COURSE_ID列からIDを削除し、新しい列がID列になりますIDを言います。 COURCESテーブルに挿入した後今
  4. COURSE_ID
  5. Concate(COURSE_BRANCH_ID,ID)として
convert(number(convert(varchar,COURSE_BRANCH_ID) + convert(varchar,ID)) 

の値を更新します。しかし、私はこのような問題と周りの19のテーブルを持っているように、これは努力の多くを必要としますトリガーを記述します。私はこれ以上何かできることがありますか?どんな提案も歓迎です!ありがとうございました!

答えて

2

この問題に関するいくつかのアプローチがあります。あなたがブランチIDをIDフィールドに連結したところであなたが言及したもの。

GUIDを使用すると、衝突の可能性はほぼゼロになります。 または、各ブランチが異なる開始値を持ち、すべてがブランチ数で増分されるように、IDシードとインクリメントを設定できます。あなたは4つのブランチを持っている場合

たとえば、その後、支社にあなたは

ID INT IDENTITY(1, 4) NOT NULL -- IDs will be 1, 5, 9...etc. 

支社で

ID INT IDENTITY(2, 4) NOT NULL -- IDs will be 2, 6, 10 ...etc 

ID INT IDENTITY(3, 4) NOT NULL -- IDs will be 3, 7, 11 ...etc 

Branch3

オンとBranch4

に設定することができ
ID INT IDENTITY(4, 4) NOT NULL -- IDs will be 4, 8, 12 ...etc. 
関連する問題