여러 개의 SQL UPDATE 문이 있거나 CASE가 포함된 단일 문이 있나요?
-
08-07-2019 - |
문제
우선순위를 순서대로 유지하고 중복된 우선순위 값을 허용하지 않는 트리거를 만들었습니다.고려해야 할 몇 가지 사항이 있습니다.
- 사용자는 우선순위를 자유롭게 설정할 수 있습니다.
- 다른 항목과 동일한 우선순위를 선택하는 것을 방해하는 것은 없습니다.
값이 다른 값과 동일하게 입력되면 새로 우선순위가 지정된 항목이 우선순위에서 우선순위를 갖고 다른 항목은 증가해야 합니다.
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에 맡겼다. 사용자 입력을 허용하지 않았습니다.
이 답변 중 어느 것이 올바른지 확신 할 수 없으므로 이것을 정확하게 표시하고 시행 착오로 커뮤니티가 파악하게 할 것입니다. :)