MySQL: как предотвратить удаление? - PullRequest
3 голосов
/ 05 ноября 2011

Как только запись введена в определенную таблицу, я думаю, что я никогда не хочу, чтобы она была удалена Записи там, чтобы отслеживать вещи в исторических целях. Я использую MySQL, InnoDB. Можно ли как-нибудь защитить эту таблицу от случайного удаления на уровне приложения? Если так, то это хороший подход?

Ответы [ 5 ]

3 голосов
/ 05 ноября 2011

Если вы можете установить разрешение для своих пользователей, не давайте разрешение на удаление.Существуют ситуации, когда эта практика «должна быть» подобна таблицам для статистических целей.Таким образом, если ваша таблица используется для достижения одной из этих целей, это хороший подход.

1 голос
/ 28 июня 2017

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

CREATE TRIGGER protect_delete before delete ON protected_table 
FOR EACH ROW UPDATE non_existing_table SET non_existing_column=1;

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

Например, можно получить сообщение об ошибке, подобное этому:

ОШИБКА 1146 (42S02): таблица «database.delete_restricted_on_tableX» не существует

РЕДАКТИРОВАТЬ: также возможно создавать еще лучшие сообщения об ошибках, пожалуйста, проверьте здесь http://www.brokenbuild.com/blog/2006/08/15/mysql-triggers-how-do-you-abort-an-insert-update-or-delete-with-a-trigger/

1 голос
/ 05 ноября 2011

Еще одним вариантом является переключение на ARCHIVE движок для исторических таблиц.

Это предотвратит любые действия по УДАЛЕНИЮ или ОБНОВЛЕНИЮ таблицы и сожмет данные. Один (главный) недостаток этого подхода заключается в том, что вы не можете индексировать столбцы в таблице.

0 голосов
/ 05 ноября 2011

Возможно, вы захотите написать триггер, который обнаружит удаление, затем повторно вставит запись, но могут быть некоторые проблемы с этим, так что вы можете просто добавить ограничение внешнего ключа, которое предотвратит удаление.

Для некоторых обсуждений по этому вопросу вы можете посмотреть: http://rpbouman.blogspot.com/2011/10/mysql-hacks-preventing-deletion-of.html.

0 голосов
/ 05 ноября 2011

Я думаю, вам следует реализовать эту логику на уровне приложения и вставить столбец, в который вы поместите флаг отсутствия удаления.

Другая идея состоит в том, чтобы исключить доступ на удаление для пользователя БД

...