質問

ビジネスルールに対して削除対象を確認するトリガーを作成し、必要に応じて削除をキャンセルします。アイデアはありますか?

ソリューションは、削除の代わりにトリガーを使用しました。 Rollback tranが削除を停止しました。削除を実行したときにカスケードの問題が発生するのではないかと心配しましたが、実際には発生しなかったようです。たぶん、トリガーはそれ自体をトリガーできません。

役に立ちましたか?

解決

INSTEAD OF DELETE を使用します( MSDN )トリガーし、トリガー内で本当にやりたいことを決定します。

他のヒント

ソリューションは、削除の代わりにトリガーを使用しました。 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 (@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

トリガーは現在のトランザクションをロールバックでき、削除をキャンセルする効果があります。上記のポスターにもあるように、トリガーの代わりにトリガーを使用することもできます。

INSTEAD OF DELETE トリガーに関するMSDNドキュメントによると:

  

DELETEに送信された削除済みテーブル   トリガーには行の画像が含まれます   削除前に存在していたため   ステートメントが発行されました。

正しく理解できれば、DELETEは実際に実行されています。何が足りないのですか?

とにかく、なぜレコードを削除したいのか理解できません。ビジネスルールに合格しなかった場合は、それらのレコードの削除を取り消します。レコードを削除する前にビジネスルールに合格すればテストが簡単になるはずだと誓います。

そして、トランザクションを使用すると言っていましたが、 INSTEAD OF トリガーについて聞いたことがありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top