0

ネットワーク上の特定のイベントのインスタンスを追跡するデータベースを使用する必要があります。それらのコピーを別の場所にある別のデータベースに保持できるようにしたいと考えています。

私が抱えている問題は、更新との同期を維持することです。データベース AI のレコードが変更された場合、データベース B をその変更で更新します。十分に単純ですが、データベース A には変更されたタイムスタンプ フィールドの形式がなく、データベースをまったく変更できません (トリガーを追加することさえできません)。1 時間ごとに同期を行う C# アプリケーションを作成しています。(これは私の要件では受け入れられます。データは常に新鮮である必要はありません)。

私の質問はこれです:

BINARY_CHECKSUM を使用すると、期待値のリストを別の場所 (メモリ/XML など) に保持し、定期的にチェックして異なるかどうかを確認できます。異なる場合は、コードで行を手動で同期できます。

これは良い考えですか?BINARY_CHECKSUM に関連する大きなオーバーヘッドはありますか? 変更できない行への変更を検出するより良い方法はありますか?

編集: SQL レプリケーションについては十分に認識していますが、2 つのデータベースは同じネットワーク上になく、C# によってアクセスされる Web サービスを介してそれらの間のインターフェイスが行われることを言及する必要がありました。

乾杯、

4

3 に答える 3

2

編集: 問題のテーブルには PK さえないように見えるので、もう BINARY_CHECKSUM を考慮しません。

クライアント コードで SHA256 またはそれ以上の関数を使用してハッシュを計算する必要があると思います。

于 2013-01-04T12:43:56.080 に答える
2

Joboの回答へのコメントにこれを投稿しました:

declare @t table (
    ColA int not null,
    ColB int not null,
    ID int IDENTITY(1,1) not null primary key
)
insert into @t values (1,0)
select BINARY_CHECKSUM(*) from @t

update @t set ColA = 0,ColB = 16 where ID = 1
select BINARY_CHECKSUM(*) from @t

結果:

-----------
257

-----------
257

いいえ、BINARY_CHECKSUMデータベースの同期を維持する手段としてはお勧めしません。

2 つの入力が明らかに異なる (ハッシュの結果が異なる場合) ことを判断するには、任意の形式のハッシュを使用することをお勧めしますが、結果が同じである場合は、通常、すべての特定の値をチェックして、入力が実際に同じか、ハッシュ値が同じです。

例外は、十分な長さのバランスの取れたハッシュ関数を使用しているため、衝突が発生する可能性が非常に低いため、一生のうちに衝突が発生しない場合です。int、32ビットでは十分な長さではありません。

于 2013-01-04T15:44:18.107 に答える
0

ターゲットDBを変更することさえできませんか?

いずれかの PK が ID である場合は、PK もマップする必要があります。

PK がデータの場合、PK が変更された場合、変更があったことはわかりますが、それがどの行にマップされているかをどのように知るのでしょうか?

コメントで、複数からの PK と同期がないことがわかりました。

PK がなければ、「変更によるデータベース B の更新」はありません。
せいぜい、一致しない行を挿入できます。
それが新しい行なのか、行の編集なのかわかりません。
ハッシュを使用すると、行を見逃す衝突の可能性があります。
1 時間ごとの同期が必要な場合は、多くの行がないことを願っています。

于 2013-01-04T14:59:44.383 に答える