2

私の新しいクライアントは、2002 年に作成された小さな VB/Access データベース アプリケーションを持っており、それを最新のものにし、彼が以前から望んでいた新機能をサポートするために書き直したいと考えています。そのため、ローカル マシンで C#.NET 2008 と SQL Server Express 2008 を使用するように変換し、リモート サーバーで WCF と SQL Server 2008 を使用するようにスケーリングする機能を備えています。

彼が興味を持っている新機能の 1 つは、一定期間にわたるデータ変更の完全な履歴を維持し、レポートすることです。以前は、トリガーとストアド プロシージャを使用してこれを行っていましたが、@!#$.

最近、SQL Server 2008 の Change Data Capture 機能をいじりたくてうずうずしていました。最初の 1 時間使ってみたところ、デフォルトで 5 秒ごとに実行されるジョブが SQL Agent に作成されることに気付きました。また、キャプチャしたテーブルのスキーマを変更する必要がある場合は、少し面倒なようです。それ以外は、私の元の方法よりも実装がはるかに簡単に思えます。だから、これらは私の質問です:

  1. 最終的にリモート サーバーに移行する可能性がある、または移行しない可能性がある小さなデスクトップ アプリケーションにとって、これはやり過ぎでしょうか?
  2. パフォーマンスに関して何を期待すればよいですか? 彼のデータベースのサイズが大きくなるにつれて、コンピューターの動作が遅いという彼からの電話が増えるのでしょうか?
  3. 現在本番環境で使用している他の人から知っておくべき、CDC に関するその他の落とし穴はありますか?
  4. 小さなデスクトップ アプリケーションにより適した、時間の経過に伴う変化を追跡するお気に入りの方法へのリンクを持っている人はいますか?

ありがとう、

マルク

4

3 に答える 3

2

CDC は、SQL Server Enterprise エディションでのみ使用できます。そのため、Express を使用している場合は使用できず、トリガーを使用し続ける必要があります。

于 2009-01-22T17:09:29.743 に答える
1

トリガーは多くの点で扱いが面倒ですが、実際にトリガーと履歴テーブルを自動的に生成するスクリプトを作成することで、メインのコードベースに影響を与えることなく、透過的なデータ監査履歴メカニズムでトリガーを使用できます。これはかなりの作業量であり、そのようなことを行ってオープンソース化した人を私は知りませんが、興味深いプロジェクトになる可能性があります。少なくともそのようにすれば、1 つのジェネレーター プロシージャを記述でき、個々のトリガーを再びいじる必要がなくなります。

于 2009-01-22T17:18:14.840 に答える
1

変更テーブルの XML 列を使用して、独自の変更データ追跡システムを使用したので、より柔軟になりました。また、トリガーをかなり一般的なものにします。

監査行を作成するためのトリガーがすでにあり、ソース表に ROWVERSION 型の「バージョン」という名前の列があるとします。

INSERT INTO [Changes].Sites
(
    SiteID,
    Operation,
    Version,
    ModifiedOn,
    DataChange
)
SELECT
    IsNull( I.SiteID, D.SiteID ),
    CASE
        WHEN D.[Version] IS NULL      AND I.[Version] IS NOT NULL  THEN 'I'
        WHEN D.[Version] IS NOT NULL  AND I.[Version] IS NOT NULL  THEN 'U'
        WHEN D.[Version] IS NOT NULL  AND I.[Version] IS NULL      THEN 'D'
        ELSE '?'
    END,
    IsNull( I.Version, D.Version ),
    SysDateTimeOffset(),
    (
        SELECT
            [Deleted] = ( SELECT * FROM deleted D1 WHERE D1.SiteID = D.SiteID FOR XML PATH(''), TYPE ),
            [Inserted] = ( SELECT * FROM inserted I1 WHERE I1.SiteID = I.SiteID FOR XML PATH(''), TYPE )
        FOR XML PATH('Changes')
    )
FROM deleted D
FULL JOIN inserted I
    ON D.SiteID = I.SiteID

私のテーブルに固有のそのクエリの唯一のものは、主キーです。これらのクエリを作成するためのテンプレートを生成するのはかなり簡単です (sys.tables などを使用して SQL で行うこともできます)。

于 2009-09-11T03:41:14.053 に答える