2008-10-29 76 views
9

我想創建一個觸發器來檢查對商業規則正在刪除的內容,然後在需要時取消刪除。有任何想法嗎?如何取消SQL中的刪除

該解決方案使用了「替代刪除」觸發器。 Rollback tran停止了刪除。我害怕在刪除時會遇到級聯問題,但似乎並未發生。也許觸發器不能觸發自己。

+0

在確定答案之前,值得一提其他人的貢獻。這個問題還不到一個小時。 – 2008-10-29 12:36:12

回答

18

使用INSTEAD OF DELETE(請參閱MSDN)觸發器並在觸發器內確定您真正想要執行的操作。

1

觸發器可以回滾當前事務,這將具有取消刪除的效果。正如上面的海報還指出,你也可以使用而不是觸發器。

1

根據MSDN文檔有關INSTEAD OF DELETE觸發器:

The deleted table sent to a DELETE trigger contains an image of the rows as they existed before the DELETE statement was issued.

如果我理解正確的DELETE被實際執行。我錯過了什麼?

無論如何,我不明白你爲什麼要刪除記錄,如果業務規則沒有通過,然後取消刪除這些記錄。如果您在刪除記錄之前通過業務規則,我會發誓應該更容易進行測試。

而且我會說使用交易,我之前沒有聽說過關於INSTEAD OF的觸發器。

+0

問題是,應用程序允許用戶刪除分配給他們的東西,但由於我沒有源代碼,我只能在數據庫級停止它。我不希望用戶刪除已分配給他們的未完成的任務。 – 2008-10-30 10:31:51

7

該解決方案使用「代替刪除」觸發器。 Rollback tran停止了刪除。我害怕我在刪除時遇到級聯問題,但似乎沒有發生。也許觸發器不能觸發自己。無論如何,謝謝你的幫助。

ALTER TRIGGER [dbo].[tr_ValidateDeleteForAssignedCalls] 
on [dbo].[CAL] 
    INSTEAD OF DELETE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @RecType VARCHAR(1) 
    DECLARE @UserID VARCHAR(8) 
    DECLARE @CreateBy VARCHAR(8) 
    DECLARE @RecID VARCHAR(20) 

    SELECT @RecType =(SELECT RecType FROM DELETED) 
    SELECT @UserID =(SELECT UserID FROM DELETED) 
    SELECT @CreateBy =(SELECT CreateBy FROM DELETED) 
    SELECT @RecID =(SELECT RecID FROM DELETED) 

    -- Check to see if the type is a Call and the item was created by a different user 
    IF @RECTYPE = 'C' and not (@[email protected]) 

    BEGIN 
     RAISERROR ('Cannot delete call.', 16, 1) 
     ROLLBACK TRAN 
     RETURN 
    END 

    -- Go ahead and do the update or some other business rules here 
    ELSE 
     Delete from CAL where RecID = @RecID  

END 
+1

如果您嘗試刪除多個記錄,則會出現以下錯誤:_Subquery返回了多個值。當子查詢遵循=,!=,<, <= , >,> =或者當子查詢用作表達式時,這是不允許的。因此,您需要以其他方式檢查權限(如_select @C = count(1)from DELETED where ..._) – inon 2014-10-19 14:02:22