次のような自己関係テーブルがあるとします。
ID - Name - ParentID
ユーザーがこのテーブルに sth を挿入するたびに、挿入された名前が挿入されたParentID
ものと等しい行に既に存在するかどうかを確認し、真の場合はトランザクションをロールバックします。
しかし問題はparentID
、挿入されたテーブルから行をチェックすると、挿入された行がすでにメインテーブルにもあることです。したがって、トリガーは常にトランザクションをロールバックします。
これが私のトリガーです:
ALTER TRIGGER TG_Check_Existance_In_myTbl
ON myTbl FOR INSERT,UPDATE AS
DEClARE @result BIT
DECLARE @numberOfRows INT
DECLARE @counter INT
DECLARE @names nVARCHAR (30)
DECLARE @name NVARCHAR (30)
SET @result = 0
SET @numberOfRows = (SELECT COUNT (Name)
FROM myTbl
WHERE ParentID IN
(
SELECT ParentID
FROM inserted
)
)
SET @counter = 1;
SELECT @name = Name
FROM inserted
WHILE (@counter <= @numberOfRows)
BEGIN
WITH Q
AS
(
SELECT ROW_NUMBER()
OVER (ORDER BY Name) 'Row', Name
FROM myTbl WHERE ParentID IN
(
SELECT ParentID
FROM inserted
)
)
SELECT @names = Name
FROM Q
WHERE Row = @counter
IF @name = @names
SET @result=1;
SET @counter = @counter + 1
END
IF @result = 1
ROLLBACK TRAN