2011-11-04 101 views
3

一旦在特定表格中输入记录,我想我永远不希望它被删除。这些记录是为了追踪历史事件的记录。我正在使用MySQL,InnoDB。有什么办法可以保护该表免受应用程序层意外删除?如果是这样,这是一个好方法吗?MySQL:如何防止删除?

回答

0

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

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

+0

如果列不能被索引,对我来说意味着什么?混合InnoDB和Archive可以吗? – StackOverflowNewbie

+0

顺便说一句,我使用InnoDB,所以我可以强制引用完整性。当我使用存档时会发生什么? – StackOverflowNewbie

+0

存档没有“行缓存”。这对我意味着什么?此外,它表示“请注意,在插入过程中大量的SELECT语句会降低压缩率,除非只使用批量或延迟插入” - 这会对我造成什么潜在问题? – StackOverflowNewbie

3

如果您可以为您的用户设置权限,请不要给予删除权限。有些情况下,这种做法是“必须”的,就像统计目的表一样。因此,如果你的桌子被用来实现这个目标之一,这是一个很好的方法。

+0

我可以为特定的表执行此操作吗?这是否需要在服务器上配置某些内容?意思是,每次我安装这个应用程序,我都需要继续这样做?如果我忘记了? – StackOverflowNewbie

+0

@StackOverflowNewbie据我所知,你不能。通常你需要在服务器上配置它。此外,你必须每次都这样做,如果你忘记了,用户将能够删除行。 –

0

我认为你应该在你的应用程序层实现这个逻辑并在你放置一个不删除标志的地方插入一个列。

另一个想法是,以排除为DB用户删除访问

+0

我试图从应用程序层保护表。我不会在此表中执行任何要删除的内容。但是,我想确保表无论如何都可以自我辩护(例如,其他人稍后会执行一些在此表中删除的逻辑 - 或者某人使用phpMyAdmin并尝试删除该表中的某些内容)。 – StackOverflowNewbie

0

您可能需要编写一个检测删除的触发器,然后重新插入记录,但可能会有一些问题是,这样你就可以也只是添加一个外键约束,以防止删除。

对于这方面的一些讨论,你可以看看:http://rpbouman.blogspot.com/2011/10/mysql-hacks-preventing-deletion-of.html

+0

重新插入记录意味着它会丢失原来的自动增量PK,对吧?您的FK约束解决方案如何工作? – StackOverflowNewbie

+0

我阅读了您提供的链接。 FK约束解决方案看起来很骇人听闻。你怎么看? – StackOverflowNewbie

+0

任何这些方法都有点冒失。防止人们删除是正确的想法,但只要不违反唯一性,您就可以插入自动增量列。 –

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/