可能ですか?
私の使用例は元帳テーブルです。レコードが作成されると、それは読み取り専用である必要があります。つまり、誰もそれを編集または削除できないようにする必要があります。これは、元帳テーブルとそれに直接関係するテーブルにのみ適用されます-同じスキーマ内に他のテーブルがあり、通常どおりに更新/削除されます。
私の理解では、データの整合性のために、このような種類の制約をデータベースレイヤーで適用する必要がありますが、これを行うためのクリーンで広く受け入れられている方法が見つかりません。アプリケーション層で?
それが変更される可能性があるため、使用されているDBプラットフォームにとらわれないように、プレーンSQLでそれを行う方法が理想的ですが、それは要求が多すぎる可能性があるため、プラットフォームに依存するため、MySQLのいくつかのフレーバーが推奨されます。
ありがとうございました!
これを達成するには、少なくとも2つの方法があります。 1つ目のアプローチは、これらの追記型テーブルに対するDELETE
とUPDATE
特権を付与しないことです。つまり、INSERT
とSELECT
以外の特権を付与せず、ユーザーがそれらに挿入または選択できるようにします。
別のオプションは、これらのテーブルでBEFORE UPDATE
およびBEFORE DELETE
トリガーを定義し、SIGNAL
ステートメントを使用してトリガー本体で例外を発生させることです。これにより、更新と削除がそれぞれ防止されます。
権限は明らかな選択のようですが、 ARCHIVE Storage Engine を使用することもできます。このテーブルエンジンは、変更されない大量のデータを記録するように設計されています。
ARCHIVEエンジンはINSERT、REPLACE、およびSELECTをサポートしていますが、DELETEまたはUPDATEはサポートしていません。 ORDER BY操作、BLOB列、および基本的に空間データタイプを除くすべてをサポートします(セクション11.5.1「空間データタイプ」を参照)。 ARCHIVEエンジンは行レベルのロックを使用します。
権限との違いは、拡張特権を持つユーザーは他のほとんどのテーブルタイプのデータを変更できることですが、ARCHIVEでは、既にテーブルにあるデータを誰も変更することはできません。
" Point in Time Architecture "または " Temporal Database Architecture "を調べてください。
データベース設計:ポイントインタイムアーキテクチャ
ほとんどのリレーショナルデータベースの実装。更新および削除コマンドは、それらの問題の前にそこにあったデータを破壊します。ただし、一部のシステムでは、データベースから情報を物理的に削除したり、データベースで更新したりする必要はありません。この記事では、Arthur Fullerがこの要件に対する解決策をポイントインタイムアーキテクチャの形で示します。これは、ユーザーが以前の時点で存在していたデータベースのイメージを破壊せずに再作成できるデータベース設計です。現在の画像。
時間データベース
ウィキペディアから、無料の百科事典
時間データベースは、時間インスタンスに関連するデータを格納します。時間データタイプを提供し、過去、現在、未来の時間に関する情報を格納します。
両方の基本的な考え方は、削除せずにデータを追加するか、または現在存在するデータ、または以前の日時に存在したデータをプルできるようにデータを格納する必要があるということです。
関連する質問:how-to-create-a-point-in-time-architecture-in-mysql 、