Как принудительно выполнить однократную запись и затем таблицу только для чтения в SQL?

28

Это вообще возможно?

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

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

Идеальным было бы найти способ сделать это простым SQL, чтобы не зависеть от того, какая платформа БД используется, поскольку это может быть изменено, но я понимаю, что это может быть слишком много, чтобы просить, поэтому, если у него есть чтобы зависеть от платформы, предпочтение отдается некоторой разновидности MySQL.

Спасибо!

altanqa
источник

Ответы:

43

Я вижу по крайней мере два способа сделать это. Первый подход заключается в том, чтобы не предоставлять DELETEи не предоставлять UPDATEпривилегии для этих таблиц однократной записи, или, в этом отношении, никаких привилегий помимо INSERTи SELECT, таким образом, только позволяя пользователям вставлять или выбирать из них.

Другим вариантом является определение BEFORE UPDATEи BEFORE DELETEтриггеры для этих таблиц и использование SIGNALоператора для создания исключения в теле триггера, что соответственно предотвратит обновления и удаления.

mustaccio
источник
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, старая строка удаляется перед вставкой новой строки. См. Раздел 13.2.5 , «ВСТАВИТЬ Синтаксис». "
Верас
7

Посмотрите на « Архитектура точки во времени » или « Архитектура временной базы данных »

Проектирование базы данных: архитектура на момент времени

В большинстве реализаций реляционных баз данных. Команды Update и Delete уничтожают данные, которые были там до их выпуска. Однако некоторые системы требуют, чтобы никакая информация физически не удалялась или не обновлялась в базе данных. В этой статье Артур Фуллер представляет решение этого требования в форме архитектуры «на определенный момент времени»: проект базы данных, который позволяет пользователю воссоздать образ базы данных в том виде, в каком он существовал в любой предыдущий момент времени, не разрушая текущее изображение.

Временная база данных

Из Википедии, свободная энциклопедическая
база данных Temporal хранит данные, относящиеся ко времени. Он предлагает временные типы данных и хранит информацию, относящуюся к прошлому, настоящему и будущему времени.

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

связанный вопрос здесь: как создать точку архитектуры времени в MySQL ,

WernerCD
источник