2011-01-27 8 views
0

私はではありません。監査または履歴追跡が必要です。SQL 2005/2008データベーストラックフィールドの変更

私は、外部ソースからデータを取得するアプリケーションを持っています。 独自のDBで外部テーブルをミラー化します。ユーザーはDB内のデータを更新できます。 次回、システムが外部データと同期するときに、ローカルで変更されていないフィールドだけが上書きされます。私はこの

1を行うには、2つの方法)各オブジェクトのストア2行と考えることができます私の頭の上オフ

。最初の1は外部バージョンで、2番目の行は外部バージョンにリンクしますが、フィールドが変更されている場合はそのフィールドにデータのみが含まれます。例:

id  |  parentId | field1  | field2 
1  |  null  |  foo  | bar 
2  |  1  |  new foo | null 

これは、ローカルユーザーがフィールド1を変更したときのデータの外観を示しています。 変更が発生しなかった場合、最初の行のみが存在します。

2)表の列数を2倍にします。 例えば name_external name_internal

それは良好な分離および照会すると2つのオブジェクト間のコードの比較で行うことが容易を提供しますようにそれはそうと、私はオプション1より良いが好き。唯一の欠点は、結果的に行が増えることですが、DBはかなり小さくなります。

他にも使用できるパターンはありますか?それとも私は、.NET 4つのWCFサービス


ソリューション

を使用するオプション1

で行くべきではない理由は、私は以下に2つのテーブルの答えとなります。ローカルに変更されているフィールドは、DBがしかUIシステムを介して更新されることができるようになり、私のように

SELECT 
    a.[ID], 
    isnull(b.[firstName], a.[firstName]), 
    isnull(b.[lastName], a.[lastName]), 
    isnull(b.[dob], a.[dob]), 
    isnull(b.active, a.active) 
From tbl1 a 
left join tbl2 b on a.[ID] = b.[ID] 

orginal値と合併した行を返すために、次のSQLを使用します。そして、人々が空の文字列を入力する代わりに値としてNULLを入力することを許可されないようにすることができます。これは、私はあなたがオプション1

を選択した場合、ユーザーがデータを更新できるようにすると、あなたはどちらかを意味しますについて考えることができる2つの問題があります。私は、ユーザーが

+0

いくつのフィールドがありますか?何行ですか?どんなSQL版? – Hawxby

+0

20テーブル、各テーブルの2〜20カラム。各テーブルは100 - 5000行の間にあります – Daveo

答えて

1

をNULLに値を更新した場合に何が起こるかの問題を克服することができます挿入/更新/削除ステートメントを実行したり、二重列構造を管理したり、すべてのユーザーを訓練してテーブルを正しく更新する必要があります。

もう1つの問題は、テーブル内のフィールドをモデル化してNULLにすることです。フィールドを表現するためにNULLを使用している場合、どのようにNULLに変わるフィールドを表現することができますか?

列数を2倍にする2つ目の方法は、更新の複雑さを避け、NULL値を格納することができますが、行のサイズが大きくなり、サーバーが移動しなければならないデータ量それをテストすることなく、この主張は実証されていませんが、私はそれが言及する価値があると思いました)。

もう1つの方法は、外部データソースとの同期が行われた直後にデータのスナップショットを保持する別のスキーマにテーブルをコピーすることです。

私はあなたが完全な監査を望んでいないことを知っています。これは、ある時点でのデータのコピーです。二重行/列の複雑さを排除することなく、ユーザが望むようにデータを変更できるようにすることができます。外部ソースと再同期すると、変更されたフィールドがわかります。

このような比較を説明する偉大な記事:The shortest, fastest, and easiest way to compare two tables in SQL Server: UNION!が見つかりました。

+0

優れた応答、いくつかの非常に有効なポイントを作る – Daveo

+0

私は2テーブルオプションと一緒に行くと思います。 EF CodeFirstを使用して実装するのは非常に簡単です。私は私が使用するSQLを表示するために私の質問を更新しました – Daveo

0

UpdatedByフィールドを更新する更新トリガーがあることを検討してください。私たちにはインポートのためのユーザーがいます。これは、インポートによって完了した場合にフィールドを更新する他のプロセスは使用できません。したがって、ユーザー-1以外の値が最後に更新された場合は、簡単に伝えることができます。次に、マージ・ステートメントを使用して挿入/削除/更新することができます。

+0

それは行全体に対してどのように動作するのか理解できますが、列ごとのシナリオでどのように動作するのか分かりません。 – Daveo

関連する問題