我在SQL Server數據庫中有一個表,其中包含一個我從不想要刪除的行。這是應用程序按設計工作所需的一行。添加約束或以其他方式阻止刪除SQL數據庫表中的記錄
有沒有辦法將約束添加到該行,以防止它被刪除?或者另一種方式來處理這種情況?
我在SQL Server數據庫中有一個表,其中包含一個我從不想要刪除的行。這是應用程序按設計工作所需的一行。添加約束或以其他方式阻止刪除SQL數據庫表中的記錄
有沒有辦法將約束添加到該行,以防止它被刪除?或者另一種方式來處理這種情況?
下面是一個使用FOR DELETE觸發器,以防止行刪除當某個條件滿足的一個例子:
CREATE TRIGGER KeepImportantRow ON MyTable
FOR DELETE
AS BEGIN
-- This next line assumes that your important table has a
-- column called id, and your important row has an id of 0.
-- Adjust accordingly for your situation.
IF DELETED.id = 0 BEGIN
RAISERROR('Cannot delete important row!', 16, 1)
ROLLBACK TRAN
END
END
雖然這取決於具體情況,但可以採取多種方式。
如果該表只包含該行,則不要授予刪除/截斷權限。
如果表中還包含其他行,則可以使用刪除前觸發器。
你會遇到的一個問題是,有DBA/SA訪問數據庫的人可以繞過你放入的任何東西,如果他們願意,那麼你想要保護什麼,偶爾用戶或任何人。
是該表具有其他行也,觸發聽起來像它可能是隻有這樣才能在數據庫級別執行此操作。 – BrooklynDev 2010-12-15 22:54:27
如果你想防止意外刪除,那麼你可以有一個聲明瞭一個外鍵到表與ON DELETE NO ACTION
一個虛擬表,並在其中添加一行與外鍵匹配你的「珍貴」中行的主鍵。這樣,如果'父'行被刪除,引擎將拒絕並引發錯誤。
如果您想防止故意刪除,那麼您應該依賴安全性(拒絕對錶的DELETE權限)。當然,具有所需權限的特權用戶可以刪除該行,但有沒有辦法來阻止這一點,也不應該嘗試。由於SQL Server不支持行級安全性,因此如果只需要拒絕某些行,則必須返回到圖形範圍並更改表格佈局,以便必須拒絕的所有行都存儲在一個表中,並且允許刪除的行存儲在不同的表中。
其他解決方案(如觸發器)最終將在這些主題的變化,你真正要解決的是你是否想以防止意外刪除(解)或故意刪除(無法解決的問題,是他們數據庫,而不是你的)。
我想知道是否可以通過以這種方式使用自引用外鍵來避免第二個表。將其設置爲您要保護的行中的Id;在其他地方設置爲NULL。嗯... – 2010-12-15 23:27:59
...好吧,我回答了我自己的問題:它不起作用。你需要第二張桌子。不過,仍然是一個好的解決方案 – 2010-12-15 23:35:29
這不是一個錯字,這個函數真的叫做RAISERROR(一個E)!請參閱http://msdn.microsoft.com/en-us/library/ms178592.aspx上的文檔,其中還介紹了其他參數(嚴重性,0-25和狀態,0-255)。 – thelem 2014-05-20 13:21:49