2011-04-30 63 views
0

我有一個表,有id,名稱,年齡。 (表名:員工)SQL刪除與交易

該id是表中的主鍵。有一個Sproc刪除給定名稱的條目。 因此,在我的刪除存儲過程中,我首先選擇基於名稱的ID。如果名字是有效的,那麼我做一個刪除。

DECLARE @Id uniqueidentifier 
BEGIN TRANSACTION 
    SELECT TOP 1 @Id=Id FROM Employee WHERE [email protected] 
    IF @@ROWCOUNT = 0 
    BEGIN 
     ROLLBACK TRANSACTION 
     RETURN ERROR_NOT_FOUND 
    END     
    DELETE FROM EMPLOYEE WHERE Id = @Id    
    IF @@ROWCOUNT = 0 
    BEGIN 
     ROLLBACK TRANSACTION 
     RETURN ERROR_NOT_FOUND 
    END 
COMMIT TRANSACTION 

我的問題是我是否需要在這種情況下需要交易。我知道我們需要一個事務,當我們想要原子操作時(一組操作應該一起通過/失敗)。

請注意上述情況是否需要交易..以及有/沒有交易的優點/缺點是什麼。

+0

大多數第一件事你需要改變使用名稱獲取ID。它不安全! 。 – 2011-04-30 12:00:33

+0

將表存儲爲表中的列也很奇怪 - 可能更安全,更穩定地存儲不變值(DoB),並在存儲過程或臨時表或視圖中使用計算的年齡。 – 2011-04-30 17:04:26

回答

1

至於你的問題的答案 - 如果沒有這個名字的僱員既不刪除也不選擇不會改變數據庫中的任何東西,因此回滾是沒有必要的。

現在,如果id是唯一的,並且名稱不是 - 通過名稱選擇員工非常危險,因爲您無法真正控制要刪除的員工(來自同名公司的員工)。看起來這個程序應該把id作爲參數,而不是按名稱來選擇它。

1

在你的示例代碼中,兩個ROLLBACK語句實際上並沒有回滾任何東西,因爲在這兩種情況下你都沒有改變數據庫中的任何東西。換句話說,不,他們沒有必要。