web-dev-qa-db-ja.com

SQLで一度だけ書き込み、次に読み取り専用のデータベーステーブルを適用するにはどうすればよいですか?

可能ですか?

私の使用例は元帳テーブルです。レコードが作成されると、それは読み取り専用である必要があります。つまり、誰もそれを編集または削除できないようにする必要があります。これは、元帳テーブルとそれに直接関係するテーブルにのみ適用されます-同じスキーマ内に他のテーブルがあり、通常どおりに更新/削除されます。

私の理解では、データの整合性のために、このような種類の制約をデータベースレイヤーで適用する必要がありますが、これを行うためのクリーンで広く受け入れられている方法が見つかりません。アプリケーション層で?

それが変更される可能性があるため、使用されているDBプラットフォームにとらわれないように、プレーンSQLでそれを行う方法が理想的ですが、それは要求が多すぎる可能性があるため、プラットフォームに依存するため、MySQLのいくつかのフレーバーが推奨されます。

ありがとうございました!

28
altanqa

これを達成するには、少なくとも2つの方法があります。 1つ目のアプローチは、これらの追記型テーブルに対するDELETEUPDATE特権を付与しないことです。つまり、INSERTSELECT以外の特権を付与せず、ユーザーがそれらに挿入または選択できるようにします。

別のオプションは、これらのテーブルでBEFORE UPDATEおよびBEFORE DELETEトリガーを定義し、SIGNALステートメントを使用してトリガー本体で例外を発生させることです。これにより、更新と削除がそれぞれ防止されます。

43
mustaccio

権限は明らかな選択のようですが、 ARCHIVE Storage Engine を使用することもできます。このテーブルエンジンは、変更されない大量のデータを記録するように設計されています。

ARCHIVEエンジンはINSERT、REPLACE、およびSELECTをサポートしていますが、DELETEまたはUPDATEはサポートしていません。 ORDER BY操作、BLOB列、および基本的に空間データタイプを除くすべてをサポートします(セクション11.5.1「空間データタイプ」を参照)。 ARCHIVEエンジンは行レベルのロックを使用します。

権限との違いは、拡張特権を持つユーザーは他のほとんどのテーブルタイプのデータを変更できることですが、ARCHIVEでは、既にテーブルにあるデータを誰も変更することはできません。

10
iHaveacomputer

" Point in Time Architecture "または " Temporal Database Architecture "を調べてください。

データベース設計:ポイントインタイムアーキテクチャ

ほとんどのリレーショナルデータベースの実装。更新および削除コマンドは、それらの問題の前にそこにあったデータを破壊します。ただし、一部のシステムでは、データベースから情報を物理的に削除したり、データベースで更新したりする必要はありません。この記事では、Arthur Fullerがこの要件に対する解決策をポイントインタイムアーキテクチャの形で示します。これは、ユーザーが以前の時点で存在していたデータベースのイメージを破壊せずに再作成できるデータベース設計です。現在の画像。

時間データベース

ウィキペディアから、無料の百科事典
時間データベースは、時間インスタンスに関連するデータを格納します。時間データタイプを提供し、過去、現在、未来の時間に関する情報を格納します。

両方の基本的な考え方は、削除せずにデータを追加するか、または現在存在するデータ、または以前の日時に存在したデータをプルできるようにデータを格納する必要があるということです。

関連する質問:how-to-create-a-point-in-time-architecture-in-mysql

7
WernerCD