我想創建一個觸發器來檢查對商業規則正在刪除的內容,然後在需要時取消刪除。有任何想法嗎?如何取消SQL中的刪除
該解決方案使用了「替代刪除」觸發器。 Rollback tran停止了刪除。我害怕在刪除時會遇到級聯問題,但似乎並未發生。也許觸發器不能觸發自己。
我想創建一個觸發器來檢查對商業規則正在刪除的內容,然後在需要時取消刪除。有任何想法嗎?如何取消SQL中的刪除
該解決方案使用了「替代刪除」觸發器。 Rollback tran停止了刪除。我害怕在刪除時會遇到級聯問題,但似乎並未發生。也許觸發器不能觸發自己。
使用INSTEAD OF DELETE
(請參閱MSDN)觸發器並在觸發器內確定您真正想要執行的操作。
觸發器可以回滾當前事務,這將具有取消刪除的效果。正如上面的海報還指出,你也可以使用而不是觸發器。
根據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
的觸發器。
問題是,應用程序允許用戶刪除分配給他們的東西,但由於我沒有源代碼,我只能在數據庫級停止它。我不希望用戶刪除已分配給他們的未完成的任務。 – 2008-10-30 10:31:51
該解決方案使用「代替刪除」觸發器。 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
如果您嘗試刪除多個記錄,則會出現以下錯誤:_Subquery返回了多個值。當子查詢遵循=,!=,<, <= , >,> =或者當子查詢用作表達式時,這是不允許的。因此,您需要以其他方式檢查權限(如_select @C = count(1)from DELETED where ..._) – inon 2014-10-19 14:02:22
在確定答案之前,值得一提其他人的貢獻。這個問題還不到一個小時。 – 2008-10-29 12:36:12