0

アプリケーションのデータベースには、アプリケーションの実行に必要なテーブル (ユーザーが編集することはできません) が含まれています。たとえば、SSRS レポートのリストを含むReportテーブルがあります。

Auto-Increment フィールドと GUID フィールドを除いて、レポートテーブルのデータはすべてのデータベースで一致する必要があります。

既存のクライアント データベースとゼロから作成したデータベースとの同期を維持するために、スクリプトを実行して既存のクライアント ベースを更新するデータベース アップデーター アプリがあります。

レポートが両方のタイプのデータベースで正しく実行されることを確認する単体テストがあります。ただし、開発者の目以外には、行とそれらの行の値がテーブル間で一致することを確認するシステム チェックはありません。これは、人的ミスを起こしやすいです。

修正するために、ユニット テスト レポートに小さなレポートを追加して、次の開発を通知する予定です。

  1. 「更新された」データベースに存在する「Made From Scratch」データベースから欠落しているレコード
  2. 「Made From Scratch」データベースに存在する「Updated」データベースから欠落しているレコード
  3. テーブル間で一致しないフィールド

これまでのところ、関連するすべてのテーブルについて上記の情報を報告するクエリがあります。

サンプル クエリは次のようになります。

--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 

結果を解析するためのコードを書くのに問題はありませんが、この方法論は次の理由で時代遅れに感じられます。

  1. いくつかのクエリ (基本的に同じことを行う) を記述する必要があります。
  2. このプロセスのメンテナンスは煩雑になる可能性があります

比較するテーブルとフィールドのリストが何らかのファイル (XML?) によって維持されるようなものを書きたいと思っています。したがって、フィールドが追加されるか変更されるかにかかわらず、ユーザーがしなければならないことは、このファイルを更新することだけです。

2 つのデータベース間でテーブルを比較し、上記のように維持できる LINQ やリフレクション (または .NET 4.0 の機能) を使用する方法はありますか?

アイデアは大歓迎です。例のアイデアは素晴らしいでしょう!:D

4

1 に答える 1

0

自動インクリメントフィールドとGUIDフィールドを除いて、レポートテーブルのデータはすべてのデータベースで一致する必要があります」とおっしゃいました。

これらのフィールドはIDフィールドであると想定します。理想的には、データベースのレプリケーションでIDフィールドもレプリケートする必要があります。これにより、IDで新しい挿入を確認できるようになり、更新の場合は、比較用のタイムスタンプフィールドを設定できます。

于 2012-04-29T19:06:58.303 に答える