2012-11-08 48 views
0

我在我的數據庫中有一個日誌表,用於存儲用戶操作的記錄。有一個UserID列,它是外鍵添加到Users表以檢查添加日誌時是否存在UserID。但是,嘗試刪除用戶會導致約束失敗,因爲它會在用戶表中留下不再存在於日誌表中的用戶標識。從日誌中刪除違規的行不是一種選擇,因爲整個要點是要有持久記錄(以便我們可以發現誰打破了什麼,基本上),因此刪除該用戶的所有操作都會使目標失敗。在INSERT上檢查SQL引用約束,但不在DELETE上

有沒有一種簡單的方法可以在插入新日誌時檢查約束(以確保用戶當時存在),但在刪除用戶時不會有這種情況嗎?我正在通過LINQ訪問數據庫,所以我的查詢使用C#,而不是SQL,所以任何需要的東西都沒有了,但我可以通過MS SQL Server Management Studio訪問數據庫,所以我可以用它來做我喜歡的事情。

編輯稍作澄清:知道誰做出行動的價值不僅僅在於問責制;在確定問題是用戶特定的,組織特定的還是系統範圍的時候是非常有用的,這可以大大縮小可能原因的列表。一旦用戶被刪除,仍然值得保留他們的行爲,並且由於各種原因知道該用戶的哪些操作仍然有用 - 例如,當追蹤由一個用戶執行特定組合的事件(例如, 。兩個行動是分開的,但是當一個緊跟在另一個之後時導致錯誤)。

+0

你可以刪除約束(保持柱),只有在你的代碼,如果用戶存在 – Yoav

+0

@Yoav我想嘗試,辦理入住手續,但它需要的日誌庫訪問用戶存儲庫,這是違反我們使用的存儲庫模式。存儲庫並不意味着彼此接觸。雖然我想我可以把它做成一個日誌服務,有一個日誌存儲庫和一個用戶存儲庫,這不會違背模式。 – anaximander

回答

0

如果您確實想保留日誌,則永遠不應該完全刪除用戶。

而不是刪除用戶記錄,更改其狀態以指示它被刪除,因此您的數據庫仍具有參照完整性。

或者,打開級聯刪除,因此當您刪除用戶時,所有日誌都會同時被刪除,這是保持參照完整性的另一種方式。

+0

他說「從日誌中刪除違規的行不是一個選項」,所以第二個建議是不合適的。 – Barmar

+0

@Barmar我同意 - 但這是問答網站,所以下一個閱讀此答案的人可能會認爲這是他們的選擇。 – Fenton

0

您可以使您的日誌表主鍵(組合鍵)獨立於用戶標識。改變你想索引你的日誌表的方式可以解決這個問題。還要確保沒有級聯刪除。

坦率地說,如果一個用戶被永久刪除,那麼使用什麼知道WHO BROKE是什麼?除非你計劃永遠困擾那個人或者不讓這個用戶參與你的庫存......)

否則你可以限制某個用戶的日誌的搜索能力,如果該用戶從系統中刪除,如果這對你來說是一個有效的選擇。

但是,保持一個至少UserID和Name的簡單表格根本不是一個壞主意。

0

如果你想知道世衛組織打破什麼?對於已刪除的記錄然後,您可以在用戶表中創建一列'Isactive'作爲位數據類型。在用戶刪除時,可以將位值更改爲「0」,而不是刪除記錄。用戶創建時將該字段設置爲1.是scenerio的唯一選項。

希望這有助於