문제

우선순위를 순서대로 유지하고 중복된 우선순위 값을 허용하지 않는 트리거를 만들었습니다.고려해야 할 몇 가지 사항이 있습니다.

  1. 사용자는 우선순위를 자유롭게 설정할 수 있습니다.
  2. 다른 항목과 동일한 우선순위를 선택하는 것을 방해하는 것은 없습니다.
  3. 값이 다른 값과 동일하게 입력되면 새로 우선순위가 지정된 항목이 우선순위에서 우선순위를 갖고 다른 항목은 증가해야 합니다.

    CREATE TRIGGER dbo.trg_Priority
        ON  dbo.Stories
        AFTER INSERT,UPDATE,DELETE
    AS
    BEGIN
        SET NOCOUNT ON;
    
    -- Insert statements for trigger here
    DECLARE @StoryId INT
    DECLARE @OldLocation INT
    DECLARE @NewLocation INT
    
    SELECT @NewLocation = Priority, @StoryId = StoryId FROM INSERTED
    SELECT @OldLocation = Priority FROM DELETED
    
    IF @NewLocation = @OldLocation
        RETURN;
    
    IF @NewLocation IS NULL
    BEGIN
        UPDATE Stories SET
            Priority = Priority - 1
        WHERE Priority > @OldLocation
    END
    
    IF @NewLocation > @OldLocation
    BEGIN
        UPDATE Stories SET
            Priority = Priority + 1
        WHERE Priority >= @NewLocation
        AND StoryId <> @StoryId
    END
    
    IF @NewLocation < @OldLocation
    BEGIN
        UPDATE Stories SET
            Priority = Priority + 1
        WHERE Priority >= @NewLocation
        AND Priority < @OldLocation
        AND StoryId <> @StoryId
    END
    END
    GO
    

저는 이 트리거를 전체적으로 테스트하지 않았으므로 우려되는 부분이 있으면 자유롭게 이야기해 주세요.내가 궁극적으로 알고 싶은 것은 이것을 사례 설명이 포함된 단일 업데이트로 변환해야 하는지 여부입니다.(그게 가능하다면요.)

이것을 단일로 만드는 것이 더 성능이 좋다면 UPDATE 성명서 나는 그것을 알아내는 데 정말로 손을 사용할 수 있습니다!

도움이 되었습니까?

해결책

트리거를 다시 작성해야합니다. Atime에서 하나의 레코드 만 삽입/업데이트 또는 삭제 될 것이라고 가정합니다. 해당 가정으로 방아쇠를 쓸 수 없으며 트리거는 행산이 아닌 데이터 배치에서 작동합니다. 업데이트에 삽입 및 삭제에 가입해야합니다. 그렇습니다. Case 문으로 업데이트를 작성하려고합니다.

그리고 왜 이것이 삭제 된 트리거입니까? 삭제 된 경우 업데이트 할 수있는 Arecord가되었습니다.

다른 팁

@@ROWCOUNT > 1인 경우 롤백하고 오류(심각도 16)를 발생시키십시오.현재 작성된 트리거로 인해 한 번에 여러 행을 삽입, 업데이트 또는 삭제하려고 시도하는 사용자의 데이터가 대량으로 손상될 수 있습니다.

즉, IronGofy가 옳습니다.조건에 관계없이 테이블을 한 번만 만질 것입니다.따라서 코드를 여러 문으로 나누면 코드를 더 쉽게 읽고 유지 관리할 수 있습니다.

여러 행을 한 번에 업데이트하려면 이를 변경해야 합니다.논리가 어려울 수도 있습니다!

이건 어때:

 UPDATE Stories SET Priority = CASE 
     WHEN Priority > @OldLocation THEN Priority-1
     WHEN Priority >= @NewLocation AND StoryID <> @StoryID THEN Priority+1
     WHEN Priority >= @NewLocation AND @Priority < @OldLocation And StoryID <> StoryID THEN Priority +1
END
GO

(눈에 띄는) 성능 차이가 없어야하며 어쨌든 데이터베이스에 단일 업데이트 문을 발행 할 것입니다.

나는이 아이디어를 버리기로 결정했고, 우선 순위를 업데이트하기 위해 UI에 맡겼다. 사용자 입력을 허용하지 않았습니다.

이 답변 중 어느 것이 올바른지 확신 할 수 없으므로 이것을 정확하게 표시하고 시행 착오로 커뮤니티가 파악하게 할 것입니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top