2013-11-02 51 views
4

我有一個表是這樣的:T-SQL如何防止刪除第一行中的表

CREATE TABLE Users 
(

    idUser int IDENTITY(1,1) PRIMARY KEY, 
firstName varchar(40) NOT NULL, 
secondName varchar(40), 
lastName varchar(70) NOT NULL, 
position varchar(80), 
section varchar(80) NOT NULL 
) 

有一個人需要只刪除用戶之一。我怎樣才能防止第一行被刪除? 我不能重新插入它,第一行必須有idUser = 1。

回答

2

您可以在表格[用戶]上創建一個觸發器,用於監視該表格中的寄存器何時被刪除。所以,你是否刪除是用戶名:1​​,那麼你不要刪除它,否則..你刪除它,這裏是代碼:

CREATE TRIGGER sampleTrigger 
    ON [Users] 
    INSTEAD OF DELETE 
AS 
    IF (SELECT idUser FROM deleted) = 1 
    BEGIN 
     RAISERROR ('Is not allowed to delete idUser: 1',1,1)  
    END 
    ELSE 
    BEGIN 
     DELETE FROM [Users] WHERE idUser = (SELECT idUser FROM deleted) 
    END 
GO 
+0

這正是我需要感謝:) – Maggie

+0

在Raiserror嚴重級別1不會拋出任何錯誤,但會提供一個信息消息意味着它不會導致你的代碼跳轉到Catch塊和代碼執行將繼續..它需要是設置爲至少16。 –

+0

好的,謝謝:) – Maggie

0

在這種情況下,您將需要另一個「審計」表,它將爲每個用戶保留記錄,以防萬一用戶刪除記錄,插入到該表中,然後創建一個用戶代替刪除觸發器,用戶在審計表中檢查該用戶詳細信息是否存在於審計表中,然後阻止它進一步刪除,如果審計表中不存在,則允許記錄刪除並添加一個爲此用戶排入審計表以防止對此用戶進一步刪除。

+0

但是這會從該表中刪除所有行其中userid不爲1這是你想要做什麼? –

+1

'有人只需要刪除其中一個用戶'=>顯然不是:)這只是一個缺少的'AND'在那裏 –

+1

@MostyMostacho很好發現不知道她的意思或試圖在這裏實現:S –

-1

您應該將這些邏輯放入您的業務(邏輯)層。
檢查要刪除的用戶是否爲UID = 1

+0

同意。在觸發器中隱藏商業邏輯有一個惡毒的習慣,以後會咬你。正確控制誰是通過域和API訪問你的數據庫比較好。 –

+0

@MikeParkhill - 這兩件事情並不相互排斥。將此邏輯放入觸發器可防止業務層中的錯誤,或者如果通過某些不通過該層的方式訪問數據庫,則會繞過此類邏輯。 –

+0

@MartinSmith如果在一個圖層中存在邏輯,其他圖層可以(並且大部分應該)忽略它。否則,似乎SQL數據庫和邏輯層都重疊。 –