質問
ビジネスルールに対して削除対象を確認するトリガーを作成し、必要に応じて削除をキャンセルします。アイデアはありますか?
ソリューションは、削除の代わりにトリガーを使用しました。 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
トリガーについて聞いたことがありません。