アプリケーションのデータベースには、アプリケーションの実行に必要なテーブル(ユーザーが編集できないテーブル)が含まれています。たとえば、私のSSRSレポートのリストを含むレポートテーブルがあります。2つのデータベース間で異なるデータの比較と報告
自動インクリメントフィールドとGUIDフィールドを除き、レポートテーブルのデータは、すべてのデータベースで一致する必要があります。
既存のクライアントデータベースをゼロから作成したものと同期させるには、スクリプトを実行して既存のクライアントベースを更新するデータベースアップデータアプリがあります。
レポートが両方のタイプのデータベースで正しく実行されるようにするユニットテストがあります。ただし、開発者の目以外では、これらの行の行と値がテーブル間で一致することを確認するシステムチェックはありません。これは人為的ミスを起こしやすい。 「更新」のデータベースに存在し
- レコードは「メイドスクラッチから」データベースから欠落: は、私は次の開発を通知するユニットテストのレポートに小さなレポートを追加することを計画し、修正するには「メイドスクラッチから」データベースに
これまでのところ、テーブル間で一致していない
--Take the fields I want to compare from TableToCompare in MadeFromScratch and put them in @First_Table_Var
--NOTE: MyFirstField should match in both tables in order to compare the values between rows
DECLARE @First_Table_Var table(
MyFirstField Varchar(255),
MySecondField VarChar(255),
MyThirdField Varchar(255),
);
INSERT INTO @First_Table_Var
SELECT
r.MyFirstField,
r.MySecondField,
l.MyThirdField
FROM
MadeFromScratch.dbo.TableToCompare r
INNER JOIN MadeFromScratch.dbo.LookUpTable l ON r.ForeignKeyID = l.PrimaryKeyID
--Take the fields I want to compare from TableToCompare in UpdatdDatabase and put them in @Second_Table_Var
DECLARE @Second_Table_Var table(
MyFirstField Varchar(255),
MySecondField VarChar(255),
MyThirdField Varchar(255),
);
INSERT INTO @Second_Table_Var
SELECT
r.MyFirstField,
r.MySecondField,
l.MyThirdField
FROM
UpdatdDatabase.dbo.TableToCompare r
INNER JOIN UpdatdDatabase.dbo.LookUpTable l ON r.ForeignKeyID = l.PrimaryKeyID
--**********************
-- CREATE OUTPUT
--**********************
--List Rows that exist in @Second_Table but not @First_Table
--(e.g. these rows need to be added to the table in MadeFromScratch)
SELECT
Problem = '1 MISSING ROW IN A MADE-FROM-SCRATCH DATABASE',
hur.MyFirstField,
hur.MySecondField,
hur.MyThirdField
FROM
@Second_Table_Var hur
WHERE
NOT EXISTS
(SELECT
*
FROM
@First_Table_Var hu
WHERE
hu.MyFirstField = hur.MyFirstField
)
UNION
--List Rows that exist in @First_Table but not @Second_Table
--(e.g. these rows need to be added to the table in UpdatdDatabase)
SELECT
Problem = '2 MISSING IN UPDATE DATABASE',
hur.MyFirstField,
hur.MySecondField,
hur.MyThirdField
FROM
@First_Table_Var hur
WHERE
NOT EXISTS
(SELECT
*
FROM
@Second_Table_Var hu
WHERE
hu.MySecondField = hur.MySecondField
)
UNION
--Compare fields among the tables where MyFirstField matches, but
SELECT
Problem = '3 MISMATCHED FIELD',
h.MyFirstField,
MySecondField = CASE WHEN h.MySecondField = hu.MySecondField THEN '' ELSE 'Created Value: ' + h.MySecondField + ' Updated Value: ' + hu.MySecondField END,
MyThirdField = CASE WHEN h.MyThirdField = hu.MyThirdField THEN '' ELSE 'Created Value: ' + CAST(h.MyThirdField AS VARCHAR(4)) + ' Updated Value: ' + CAST(hu.MyThirdField AS VARCHAR(4)) END,
FROM
@First_Table_Var h
INNER JOIN @Second_Table_Var hu on h.MyFirstField = hu.MyFirstField
WHERE
NOT EXISTS
(SELECT
*
FROM
@Second_Table_Var hu
WHERE
hu.MyFirstField = h.MyFirstField and
hu.MySecondField = h.MySecondField and
hu.MyThirdField = h.MyThirdField and
)
ORDER BY Problem
が、私は結果を解析するためにコードを書く問題ありませんが、この方法論:
サンプルクエリは、次のようになります
- いくつかのクエリ(本質的に同じことを行う)は、書かれる必要があります。
- このプロセスのメンテナンスは面倒なことがあります
私は、比較するテーブルとフィールドのリストが何らかのファイル(XML?)によって維持されているものを書くことができます。したがって、フィールドが追加されたかどうか、またはユーザーが行うすべての変更は、このファイルを更新することです。
LINQおよび/またはReflection(またはその点については.NET 4.0の任意の機能)を使用する方法はありますか?ここでは、2つのデータベース間の表を比較し、上記のように維持できますか?
アイデアを歓迎します。例のアイデアは素晴らしいでしょう! :D
私はそれに従うことが難しいと思う。 "既存のクライアントデータベースと、最初から作成されたものと同期します。" 1つは複数です。多分例を挙げることができます。 – Paparazzi
いくつか質問があります。クロスマッチングのためにガイドを使用しないでください。同時に存在する複数のスクラッチデータベースについてですか?スクラッチデータベース内の完全なテーブルの内容を_replace_できませんか? –