2012-04-29 20 views
0

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

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

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

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

  1. レコードは「メイドスクラッチから」データベースから欠落:

    は、私は次の開発を通知するユニットテストのレポートに小さなレポートを追加することを計画し、修正するには「メイドスクラッチから」データベースに

これまでのところ、テーブル間で一致していない

  • フィールドの存在「を更新」データベースから欠落
  • レコードは、私がQUEを持っています関係するすべてのテーブルについて上記の情報を報告してください。

    :次のような理由で時代遅れを感じ

    --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?)によって維持されているものを書くことができます。したがって、フィールドが追加されたかどうか、またはユーザーが行うすべての変更は、このファイルを更新することです。

    LINQおよび/またはReflection(またはその点については.NET 4.0の任意の機能)を使用する方法はありますか?ここでは、2つのデータベース間の表を比較し、上記のように維持できますか?

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

  • +0

    私はそれに従うことが難しいと思う。 "既存のクライアントデータベースと、最初から作成されたものと同期します。" 1つは複数です。多分例を挙げることができます。 – Paparazzi

    +0

    いくつか質問があります。クロスマッチングのためにガイドを使用しないでください。同時に存在する複数のスクラッチデータベースについてですか?スクラッチデータベース内の完全なテーブルの内容を_replace_できませんか? –

    答えて

    0

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

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

    関連する問題