一旦在特定表格中輸入記錄,我想我永遠不希望它被刪除。這些記錄是爲了追蹤歷史事件的記錄。我正在使用MySQL,InnoDB。有什麼辦法可以保護該表免受應用程序層意外刪除?如果是這樣,這是一個好方法嗎?MySQL:如何防止刪除?
回答
另一個選項是切換到歷史表的ARCHIVE引擎。
這將阻止表上的任何DELETE或UPDATE操作,並壓縮數據。這種方法的一個(主要)缺點是您無法索引表格中的列。
如果您可以爲您的用戶設置權限,請不要給予刪除權限。有些情況下,這種做法是「必須」的,就像統計目的表一樣。因此,如果你的桌子被用來實現這個目標之一,這是一個很好的方法。
我可以爲特定的表執行此操作嗎?這是否需要在服務器上配置某些內容?意思是,每次我安裝這個應用程序,我都需要繼續這樣做?如果我忘記了? – StackOverflowNewbie
@StackOverflowNewbie據我所知,你不能。通常你需要在服務器上配置它。此外,你必須每次都這樣做,如果你忘記了,用戶將能夠刪除行。 –
我認爲你應該在你的應用程序層實現這個邏輯並在你放置一個不刪除標誌的地方插入一個列。
另一個想法是,以排除爲DB用戶刪除訪問
我試圖從應用程序層保護表。我不會在此表中執行任何要刪除的內容。但是,我想確保表無論如何都可以自我辯護(例如,其他人稍後會執行一些在此表中刪除的邏輯 - 或者某人使用phpMyAdmin並嘗試刪除該表中的某些內容)。 – StackOverflowNewbie
您可能需要編寫一個檢測刪除的觸發器,然後重新插入記錄,但可能會有一些問題是,這樣你就可以也只是添加一個外鍵約束,以防止刪除。
對於這方面的一些討論,你可以看看:http://rpbouman.blogspot.com/2011/10/mysql-hacks-preventing-deletion-of.html。
重新插入記錄意味着它會丟失原來的自動增量PK,對吧?您的FK約束解決方案如何工作? – StackOverflowNewbie
我閱讀了您提供的鏈接。 FK約束解決方案看起來很駭人聽聞。你怎麼看? – StackOverflowNewbie
任何這些方法都有點冒失。防止人們刪除是正確的想法,但只要不違反唯一性,您就可以插入自動增量列。 –
我使用觸發器來檢測刪除,並執行一些非法的東西,所以整個操作失敗。例如像這樣:
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/
- 1. 防止刪除列在MySQL
- 2. 如何防止刪除NULLS?
- 3. 防止刪除
- 4. UITableViewCell防止刪除
- 5. Memcached - 如何防止項目被刪除
- 6. 如何防止Installshield刪除文件?
- 7. 如何防止用戶刪除記錄
- 8. 如何防止文字被刪除
- 9. 如何防止用戶刪除liferay portlet?
- 10. 如何防止刪除「默認」實體?
- 11. 如何防止子記錄被刪除
- 12. 如何防止刪除EditText中的spannable
- 13. 如何防止撇號被刪除PHP MySQL
- 14. 如何防止在MySql中刪除默認行?
- 15. 如何防止Mysql數據庫被更改/更新/刪除?
- 16. 防止文件刪除
- 17. 防止刪除雙引號
- 18. 防止刪除實體
- 19. 防止unlist刪除空值
- 20. 防止意外刪除
- 21. 防止eclipse刪除空白
- 22. 如何防止零除?
- 23. 如何防止刪除家長,如果它有子記錄?
- 24. 如何防止has_and_belongs_to_many刪除選項刪除正在Rails中使用的記錄?
- 25. CONTENTEDITABLE:防止內部元件被刪除
- 26. 防止特定ID的刪除
- 27. 防止從BigCommerce API中意外刪除
- 28. 防止用戶刪除在TFS
- 29. jquery防止刪除每個表格行
- 30. 防止刪除特定記錄
如果列不能被索引,對我來說意味着什麼?混合InnoDB和Archive可以嗎? – StackOverflowNewbie
順便說一句,我使用InnoDB,所以我可以強制引用完整性。當我使用存檔時會發生什麼? – StackOverflowNewbie
存檔沒有「行緩存」。這對我意味着什麼?此外,它表示「請注意,在插入過程中大量的SELECT語句會降低壓縮率,除非只使用批量或延遲插入」 - 這會對我造成什麼潛在問題? – StackOverflowNewbie