1

「トゥームストーニング」の実装を任されている既存のCRUDアプリがあります。ユーザーがデータの特定のページを前の状態にロールバックできるようにする方法が必要です。

このアプリのページに名、名前、社会保障番号があるとします。ユーザーAが[姓]フィールドを更新します。後で、ユーザーBは新しい名前が異なることに気付き、誰が名前を変更したかを確認し、必要に応じてロールバックしたいと考えています。

私はこれに慣れていないので、いくつかの用語を見逃したり誤用したりした場合は、許してください。

このアプリにはMSSQLバックエンドがあり、DALはほとんどSPROCSです。今のところ、アーカイブや墓石の投石はありません。

tblPerson-> tblPersonTombstoneという既存のテーブルごとにテーブルを作成すると、ロールバック部分がそのテーブルから読み取られると思っていました。残念ながら、元のDB設計者は、アプリの1つのページに2つまたは3つの異なるテーブルからの情報が含まれるように設計しました。したがって、私は想像しますが、よりトランザクションベースのアプローチが必要です。

任意の方向またはポインタをいただければ幸いです。私は自分の考えで正しい方向に進んでいますか?多分私はそれを複雑にしすぎていますか?他の人はどのようにそれをしましたか?

この投稿を見る.netWindowsアプリケーションで「元に戻る」操作を実装する方法は?また、この1つの新しいCodePlexプロジェクト:単純なUndo / Redoフレームワークですが、どちらも実際の状況に適合しないのではないかと心配しています。ユーザーがctl+zをクリックできるようにするつもりはありません。ページ全体を前の状態にロールバックさせる必要があります。これらの2つの例の使用法を誤解している場合は、そのように言ってください。

時間をありがとう。

4

2 に答える 2

2

あなたが話していることは、監査のトピックに該当します。残念ながら、これはより複雑な実装の1つです。

ベストプラクティスは次のとおりです。

監査対象のテーブルを反映する新しい「リビジョンテーブル」を作成しますが、追加のメタデータ(リビジョン番号、タイムスタンプ、変更を行ったユーザー、CRUD操作のタイプ)も含めます。

アイデアは、いつでもレコードの完全なスナップショットを簡単に取得し、それを使用して完全なロールバックを実行できるようにすることです。あなたはデータが正しく、それが正しく機能することを完全に確信しています。

ほとんどの人は、トリガーを使用してこれらのリビジョンレコードにデータを入力します。

他の解決策もあります。明らかに、この方法でこれを行うと、時間がかかり、ディスクスペースを大量に消費します(ただし、システムを壊すことなく、古いレコードを安全にパージできます)。利点は、多くの柔軟性が得られることです。

これがほとんどの人のやり方です。

別の方法は次のとおりです。

また、変更されたテーブルの名前、変更されたフィールド、古い値と新しい値、および通常のメタデータを追跡する、より単純な監査パターンを実装しました。

それで、監査データの保存をほぼ自動的に処理するORMツールのプラグインを作成しました。そうでなければ、これは非常に面倒だったでしょう。

あなたはこのルートに行きたくなるかもしれません。そしてそれは本当です、あなたはおそらくそれからロールバックを得ることができます。しかし、それはもっと難しいでしょう。たとえば、特定の日時に復元する場合は、完全なスナップショットを再作成するために、これらの個々のフィールドレベルの変更レコードをすべて分析する必要があります。そして、もしあなたが畑の名前を変えたら、あなたは悲惨です!

したがって、この監査方法は、監査証跡を生成および表示するのに適していますが、ロールバックを実行する場合は、可動部分が多く、問題が発生する可能性があります。私の言葉に注意してください。ロールバックが必要な場合は、これを避けてください。これらのリビジョンテーブルを作成するだけでなく、より多くの作業が必要になります。

リンク

これは、SQL Serverでの監査の実装について説明しているstackoverflowのリンクです。一部の人々は、SQL2008Enterpriseの新機能であるChangeDataCaptureについて言及しています...自動的にロールバックは行いませんが、監査データは保存されます。

SQL Serverに監査テーブルを実装するための提案はありますか?

于 2009-09-16T14:25:47.473 に答える
1

2つの考え:

  1. 永続テーブルの複製である必要はないが、ロールバック機能を使用してページ上のデータを表すだけのアーカイブテーブルを作成します。したがって、ページに複数のテーブルに影響を与えるフィールドが含まれている場合、アーカイブテーブルには、ページ上の変更可能な各フィールドの列が含まれます。

  2. ページ上のデータが単一のDTOまたはエンティティオブジェクトにカプセル化されている場合は、オブジェクトを変更する前にオブジェクトをシリアル化して、アーカイブテーブルに保存します。次に、ユーザーがロールバックしたい場合は、それを逆シリアル化してから、逆シリアル化されたオブジェクトを保存できます。

于 2009-09-16T14:26:00.667 に答える