문제

비즈니스 규칙에 대해 삭제되는 내용을 확인한 다음 필요한 경우 삭제를 취소하기 위해 트리거를 만들고 싶습니다. 어떤 아이디어?

솔루션은 삭제 트리거 대신 사용되었습니다. 롤백 트랜이 삭제를 중지했습니다. 삭제를했을 때 캐스케이드 문제가 있을까 두려웠지만 그 일은 일어나지 않은 것 같습니다. 방아쇠가 스스로 트리거 할 수 없을 수도 있습니다.

도움이 되었습니까?

해결책

an을 사용하십시오 INSTEAD OF DELETE (보다 MSDN) 트리거하고 트리거 내에서 실제로하고 싶은 일을 결정하십시오.

다른 팁

솔루션은 삭제 트리거 대신 사용되었습니다. 롤백 트랜이 삭제를 중지했습니다. 삭제를했을 때 캐스케이드 문제가 있을까 두려웠지만 그 일은 일어나지 않은 것 같습니다. 방아쇠가 스스로 트리거 할 수 없을 수도 있습니다. 어쨌든, 당신의 도움에 감사드립니다.

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 (@USERID=@CREATEBY)

    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

트리거는 현재 트랜잭션을 롤백 할 수있어 삭제를 취소하는 효과가 있습니다. 위의 포스터에서도 언급 한대로 트리거 대신에 사용할 수도 있습니다.

MSDN 문서에 따르면 INSTEAD OF DELETE 트리거 :

삭제 트리거로 전송 된 삭제 된 테이블에는 삭제 명령문이 발행되기 전에 존재했던 행의 이미지가 포함되어 있습니다.

올바르게 이해하면 삭제가 실제로 실행됩니다. 내가 무엇을 놓치고 있습니까?

어쨌든, 나는 왜 당신이 레코드를 삭제하고 싶은지 이해하지 못하고 비즈니스 규칙이 통과되지 않으면 해당 레코드를 제거합니다. 레코드를 삭제하기 전에 비즈니스 규칙을 통과하면 테스트하는 것이 더 쉬워 야한다고 맹세했을 것입니다.

그리고 나는 거래를 사용한다고 말했을 것입니다. INSTEAD OF 트리거.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top