2011-11-04 100 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/