Як примусити один раз записувати таблицю бази даних у SQL один раз, а потім прочитати лише один раз?


28

Чи можливо це навіть?

Мій випадок використання - це таблиця великої книги, з вимогою, що після створення запису він повинен бути лише для читання, тобто ніхто не повинен мати змогу редагувати чи видаляти його. Це стосується лише таблиці та книги, що мають пряме відношення до неї - є й інші таблиці в тій же схемі, які будуть оновлені / видалені як звичайні.

Я розумію, що для цілісності даних ці обмеження повинні застосовуватися на рівні бази даних, але я не можу знайти чистий, широко прийнятий спосіб цього зробити - чи це такий випадок використання, коли я б просто краще це робив в шарі програми?

Ідеальним було б спосіб зробити це в простому SQL, щоб бути агностиком того, яка платформа DB використовується, оскільки це може бути змінено, але я розумію, що це може бути занадто багато, щоб просити, так що якщо він має щоб бути залежними від платформи, перевагу надає деякий аромат MySQL.

Дякую!

Відповіді:


43

Я бачу принаймні два способи цього досягти. Перший підхід полягає в тому, щоб не надавати DELETEта UPDATEпривілеї на цих таблицях одноразового запису, або, з цього приводу, будь-які привілеї, окрім, INSERTі SELECT, таким чином, лише дозволяти користувачам вставляти або вибирати з них.

Інший варіант - визначити BEFORE UPDATEта BEFORE DELETEзапустити в цих таблицях та використовувати SIGNALоператор для винятку в тілі тригера, який би запобігав оновленням та видаленням відповідно.


6
Я б рекомендував обидва варіанти, оскільки ви чітко пояснюєте свій намір і змушуєте вживати декілька навмисних дій, щоб його порушити
Адам Мартін

3
Тригери є кращим вибором, оскільки вони спрацьовують по всіх транзакціях, включаючи операції, здійснені адміністративними користувачами, і можуть давати більш конкретні повідомлення про помилку.
Blrfl

10

Дозвіли здаються очевидним вибором - проте ви також можете використовувати механізм зберігання ARCHIVE . Цей двигун таблиці створений для запису великої кількості даних, які не змінюватимуться:

Двигун ARCHIVE підтримує INSERT, REPLACE та SELECT, але не DELETE або UPDATE. Він підтримує операції ORDER BY, BLOB стовпці та в основному всі типи просторових даних, крім типів (див. Розділ 11.5.1, "Типи просторових даних"). Двигун ARCHIVE використовує блокування на рівні рядків.

Різниця дозволів полягає в тому, що хтось із розширеними привілеями все-таки зможе змінити дані про більшість інших типів таблиць, тоді як ARCHIVE не дозволяє комусь змінювати дані, які вже є в таблиці.


1
З тут , здається , що REPLACEце свого роду UPDATE! "REPLACE працює точно так само, як INSERT, за винятком того, що якщо старий рядок у таблиці має таке ж значення, як новий рядок для PRIMARY KEY або UNIQUE index, старий рядок видаляється перед тим, як вставити новий рядок. Див. Розділ 13.2.5 , "Синтаксис INSERT". "
Vérace

7

Подивіться на " Архітектура точок часу " або " Архітектура тимчасової бази даних "

Дизайн баз даних: точка в архітектурі часу

У більшості реляційних реалізацій баз даних. Команди оновлення та видалення знищують дані, які були там перед їх видачею. Однак деякі системи вимагають, щоб будь-яка інформація фізично не видалялася з бази даних або була оновлена ​​фізично. У цій статті Артур Фуллер представляє рішення цієї вимоги у вигляді архітектури «Поточний час»: дизайн бази даних, що дозволяє користувачеві відтворити зображення бази даних, як вона існувала в будь-який попередній момент часу, не руйнуючись. поточне зображення.

Тимчасова база даних

З Вікіпедії безкоштовна енциклопедія
Temporal база даних зберігає дані, що відносяться до часових випадків. Він пропонує тимчасові типи даних і зберігає інформацію, що стосується минулого, теперішнього та майбутнього часу.

Основна ідея обох полягає в тому, що вам або потрібно додавати дані, не видаляючи - або зберігати дані таким чином, щоб ви могли витягувати дані, як вони існують в даний час ... або існували в попередній час.

пов'язане питання тут: як створити-в-точку-в-час архітектуру-в-mysql ,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.