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


28

それも可能ですか?

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

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

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

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

回答:


43

これを達成するには、少なくとも2つの方法があります。最初のアプローチは、許可しないことですDELETEし、UPDATEこれらのライトワンステーブル、または、そのことについては、別に任意の権限からの権限INSERTとはSELECT、これだけユーザーが挿入またはそれらの中から選択することができます。

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


6
私はあなたがあなたの意図を明確にするため、両方のオプションをお勧めしますし、それに違反して、複数の意図的な行動を取る必要がありますになるだろう
アダム・マーティン

3
トリガーは、管理ユーザーが行うトランザクションを含むすべてのトランザクションで起動し、より具体的なエラーメッセージを表示できるため、より適切な選択肢です。
Blrfl

10

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

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

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


1
ここから、それREPLACEは一種のように見えますUPDATE!「REPLACEはINSERTとまったく同じように機能します。ただし、テーブル内の古い行がPRIMARY KEYまたはUNIQUEインデックスの新しい行と同じ値を持つ場合、新しい行が挿入される前に古い行が削除されます。 、「INSERT構文」。」
ベラス

7

Point in Time Architecture」または「Temporal Database Architecture」を調べます

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

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

時間データベース

Wikipediaの無料の百科事典
Temporalデータベースには、時間インスタンスに関連するデータが格納されています。一時的なデータ型を提供し、過去、現在、未来の時間に関する情報を保存します。

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

ここに関連する質問: mysqlポイントオブタイムを作成する方法

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.