web-dev-qa-db-ja.com

データベースエントリの変更履歴を保持する方法

データベースエントリ(データ)のバージョン管理を可能にする方法は何ですか?

記事の変更を元に戻すコンテンツ管理システムの機能を考えてみてください。

彼らの長所/短所は何ですか?

26
matcauthon

基本的に2つの方法があります。以前のすべての値が格納されている監査テーブル、またはテーブルの一部として開始/終了日を含める方法です。すべての更新では、古いレコードを閉じながら新しいレコードを作成します。

更新:SQL SERVER 2016はこれを設計パターン/テーブルタイプとしてサポートします— https://docs.Microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server -2017

20
jmoreno

1つのアイデアは、「挿入のみのデータベース」を使用することです。基本的な考え方は、行のデータを削除または更新しないことです。

追跡が必要な各テーブルには、2つのdatetimefromtoがあります。それらは、それぞれNULLの値で始まります(時間の始まりから時間の終わりまで)。行を「変更」する必要がある場合は、新しい行を追加し、同時に前の行のtoNowに更新し、fromNowに追加する行。

詳細については、以下をご覧ください。

この手法はAuditTrailと呼ばれ、レガシーデータを管理し、その変更履歴を保存します。

この性質の質問はすでに投稿されているようです:

9
Yusubov

各テーブルにトリガーを使用して_historyにデータを維持でき(または任意の名前を付けることができます)、メインテーブルで挿入、更新、削除を行うたびにトリガーがトリガーされ、このテーブルに詳細を保存できます。トリガーメカニズムSQLiteデータベースを使用している場合は、それも使用できます。

このメカニズムは、大規模なプロジェクトにも役立ちます。このテーブルでは、変更を行ったユーザーの情報と、変更のタイムスタンプを記録できます。その後、要件に一致する任意のタイムスタンプにテーブルを復元できます。

すべてのデータベースには、トリガーを記述およびコーディングする独自の方法があります。 SQLiteを使用している場合は、構文について SQLite.org にアクセスしてください。その他のデータベースについては、公式サイトをご覧ください。

2
SME

あなたはおそらく Sqlite dbエンジンを知っています。データベース全体が1つのファイルに保存されます。このAPIは仮想ファイルシステムもサポートしているため、基本的にはどこでも、どのような形式でもストレージを整理でき、特定のファイルオフセットでの読み取りおよび書き込み操作に応答するだけです。これに使用できるアプリケーションは、暗号化、圧縮などです。コンテナーレイヤーがデータベース、sqlまたはsqliteファイル形式について何も認識していないことが最も重要な部分であり、xReadおよびxWriteコールバックに従うだけです。

アイデアの1つは、タイムマシン機能を実装することでした。そのため、xWrite操作では、「元に戻す」履歴で上書きされるすべてのセグメントが保存され、ユーザーは過去の日付を選択して、データベースに何が含まれているかを確認できます(おそらく読み取り専用モード)。まだ実際の例はありませんが(sqliteメールリストに ディスカッション についてありました)、おそらく他のエンジンがVFS APIを提供しているため、同様のことが可能です。そして、それが実装されると、どんな複雑なデータベース構造とも互換性を持つはずです。

1
Maksee

データベースエントリのバージョン管理に使用する方法は、監査テーブルを使用することです。テーブルには次のようなスキーマがあります。

Seq      - Int      ' Unique identifier for this table
Event    - Char     ' Insert / Update / Delete
TblName  - Char     ' Table that had field value changed
FldName  - Char     ' Field that was changed
KeyValue - Char     ' delimited list of values for fields that make up the PK of table changed
UsrId    - Char     ' User who made the change
OldValue - Char     ' Old value (converted to character)
NewValue - Char     ' New value (converted to character)
AddTs    - DateTime ' When the change was made

次に、追跡するテーブルの挿入/更新/削除のトリガーがあります。

長所:

  • すべてのデータは1つのテーブルにあります
  • テーブル内のすべてのフィールドまたは特定のフィールドを追跡するように設定できます
  • テーブルの各フィールドのバージョン管理を簡単に表示

短所:

  • 1つのテーブルにすべての監査情報があると、非常に多くのレコードが発生します。
  • 必要なトリガーがたくさん
1
briddums

私はこれのバージョンを今やっています。すべてのレコードについて、挿入日、変更日、アクティブレコードのブールフラグがあります。最初の挿入では、挿入日と変更日は両方ともNow()に設定され(この例はAccessにあります)、アクティブレコードフラグはtrueに設定されています。次に、そのレコードを変更する場合、すべてを新しいレコードにコピーし、ユーザーが変更するフィールドを変更します。挿入日を元の日付のままにし、変更日をNow()に変更します。次に、元のレコードのアクティブレコードフラグをfalseに、新しいレコードをtrueに切り替えます。元のレコードのIDを保存するModifiedRecordsParentIDのフィールドもあります。

次に、クエリを実行する必要がある場合でも、ActiveRecord = trueと私は最新の情報のみを取得します。

0
Brad

また、時間の経過とともにDBへのすべての変更を保存する場合は、ロギングをチェックすることをお勧めします( https://stackoverflow.com/questions/3394132/where-can-i-find-the-mysql -transaction-log

0
Sabrina Gelbart