10

ビジネス ルールに対して削除対象を確認し、必要に応じて削除をキャンセルするトリガーを作成したいと考えています。何か案は?

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

4

4 に答える 4

19

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

于 2008-10-29T10:19:48.903 に答える
9

このソリューションでは、削除トリガーの代わりにトリガーを使用しました。ロールバックトランは削除を停止しました。削除を行ったときにカスケードの問題が発生するのではないかと心配していましたが、それは発生しなかったようです。たぶん、トリガーはそれ自体をトリガーすることはできません。とにかく、あなたの助けに感謝します。

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
于 2008-10-29T11:10:55.447 に答える
1

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

于 2008-10-29T10:49:16.457 に答える
1

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

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

私が正しく理解している場合、DELETE は実際に実行されています。私は何が欠けていますか?

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

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

于 2008-10-29T10:59:14.173 に答える