MySQL:如何防止删除?

时间:2011-11-04 21:10:32

标签: mysql database innodb

在特定表格中输入记录后,我想我不希望将其删除。记录用于记录历史目的。我正在使用MySQL,InnoDB。有什么方法可以保护该表不被应用程序层意外删除?如果是这样,这是一个好方法吗?

5 个答案:

答案 0 :(得分:3)

如果您可以为用户设置权限,请不要授予删除权限。在某些情况下,这种做法是“必须”的,就像统计用途的表格一样。因此,如果您的表用于实现此目标之一,那么这是一个很好的方法。

答案 1 :(得分:1)

我使用一个检测删除的触发器并执行一些非法操作,因此整个操作失败。例如:

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使用更好的名称。

例如,可以获得如下错误消息:

  

ERROR 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/

答案 2 :(得分:0)

我认为你应该在你的应用程序层中实现这个逻辑,然后在你输入no-delete标志的位置插入一个列。

另一个想法是排除db用户的删除访问

答案 3 :(得分:0)

您可能想要编写一个检测删除的触发器,然后重新插入记录,但可能存在一些问题,因此您也可以添加一个防止删除的外键约束。

有关此问题的一些讨论,请查看:http://rpbouman.blogspot.com/2011/10/mysql-hacks-preventing-deletion-of.html

答案 4 :(得分:0)

另一个选择是切换到历史表的ARCHIVE引擎。

这将阻止对表执行任何DELETE或UPDATE操作,并压缩数据。这种方法的一个(主要)缺点是您无法索引表中的列。