0

次のような自己関係テーブルがあるとします。

   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
4

1 に答える 1

1

私が何かを見逃していない限り、あなたはこの方法を難しくしすぎています。

2 つの列に一意の制約を使用しないのはなぜですか?

table_constraint (Transact-SQL)

于 2012-09-20T19:25:17.347 に答える