2014-10-30 112 views
-1

刪除主記錄時,級聯觸發器將被觸發並刪除子表中的記錄。 我無法從表中手動刪除記錄,因爲它與子表有外鍵關係。如何防止子記錄被刪除

但是,我怎樣才能防止從表中手動刪除子記錄。目前,我可以手動刪除子頁記錄,並在頁面加載時刪除子記錄,頁面加載失敗。

回答

1

我有點不清楚爲什麼你想要做這樣的事情。除了級聯刪除之外,您不允許刪除用戶界面上的子記錄 - 只是不要給用戶選項。

如果你擔心一些隨機的DBA會在你的數據庫和寫作:

delete from childTable where parentId = 5 -- or whatever 

那麼我認爲你有更多的事情需要擔心......比如爲什麼人們生產數據庫的寫訪問甚至考慮在您的prod數據庫上手動編寫和執行諸如此類的語句。

如果你仍然需要做這樣的事情。您可能會在您的所有子表上寫入before delete觸發器,以確保在刪除之前父表中不存在parentId。這將可能導致您的級聯刪除失敗(我猜),所以你需要更新你的級聯刪除功能,以刪除之前禁用觸發器,重新啓用後的觸發器。但是這不會阻止你的「隨機dba」通過禁用觸發器,刪除記錄和重新啓用來做類似的事情。

如果您提供更多關於兒童記錄爲什麼「手動」被刪除的特定情況的信息,可能會提供更多信息。

+0

我想你誤解了這個問題。 OP希望只允許通過CASCADE刪除刪除子記錄,並防止單獨刪除子記錄。 – 2014-10-30 13:22:35

+0

管理員可以通過管理工作室意外刪除子記錄。如果我們禁用觸發器,其他同時工作的用戶將無法使用觸發器。 – user1921730 2014-10-30 16:15:07

+0

管理員也可能通過管理工作室意外刪除數據庫中的所有表。這是對生產數據庫中的任何人員授予dbo權限的風險。我不太確定你希望在不限制用戶訪問數據庫的情況下實現的目標。 – Kritner 2014-10-30 16:31:08

1

我不知道誰或什麼會手動從該表中刪除記錄,但我會向精益使用DENY權限這一要求,並確保數據庫上的所有角色都在該表中沒有delete權限。

示例腳本:

USE [YOUR_DB] 
GO 
DENY DELETE ON [dbo].[YOUR_TABLE] TO [DOMAIN\user] 
GO 

更換[dbo]相關架構名稱,並與相關用戶更換[DOMAIN\user]

+0

謝謝Tanner。但是當刪除主表中相應的記錄時,我需要刪除子表中的記錄。即,當刪除主表中的記錄時,級聯刪除觸發器將被觸發以從子表中刪除記錄。在這種情況下,如果我們應用拒絕刪除級聯刪除將失敗或不。 – user1921730 2014-10-30 14:27:06

+1

究竟是誰在擔心「手動」刪除記錄?你的應用程序或域用戶? – Kritner 2014-10-30 14:37:11

+1

@ user1921730,以便應用程序或您的系統管理員用戶有權根據需要刪除記錄,但任何其他用戶都具有此DENY權限。因此,您擔心的任何隨機用戶都無法從子表中刪除記錄。如果這個問題還有更多的問題,請更新您的問題與場景和更多細節來澄清事情。 – Tanner 2014-10-30 14:44:28