면책 조항 : 하단에있는 노트를 참조하십시오. 꼭 트리거를 사용하는 것은 권장하지 않습니다.
당신은 삽입 할 step
의 값을 변경하는 instead of
트리거를 사용할 수 있습니다 :이 원활 단일 또는 여러 레코드의 삽입을 처리해야
Create Trigger Instructions_UpdateSet
On [Instructions]
Instead of Insert
AS
BEGIN
insert instructions
select
i.recipe,
coalesce(ii.maxstep, -1)
+ row_number() over (partition by i.recipe order by i.step),
i.instruction
from inserted i
left join (select recipe, max(step) as maxstep from instructions group by recipe)
ii on i.recipe = ii.recipe
END;
. 단일 쿼리에 여러 레코드를 삽입하는 경우 들어오는 레코드의 순서를 나타 내기 위해 step
값을 제공 할 수 있으며 적절하게 정렬되고 기존 레코드 다음에 순차적으로 번호가 매겨집니다.
데모 : 응용 프로그램에서 트리거를 사용하는 경우 http://www.sqlfiddle.com/#!6/b13d5/1
몇 가지 참고 :
- 그들은 매우 잘 숨기 때문에 트리거 잊어하는 것은 매우 쉽습니다. 그것들을 문서화해야한다. 그렇지 않으면 삽입 한 데이터가 데이터베이스에서 동일하지 않을 때 다음 개발자가 혼란 스러울 것이다.
- 캐싱 계층을 사용하는 경우 레코드 삽입 후 캐시를 새로 고쳐야 트리거로 인한 변경 사항을 가져와야합니다.
- 일반적으로 비즈니스 로직에 대한 트리거를 피하는 것이 좋습니다.성능을 찾고 있다면 스토어드 프로 시저를 사용하는 것이 더 나을 것입니다. 스토어드 프로 시저는 의도와 동작에 대해 훨씬 더 분명합니다. 트리거는 데이터 유효성 검사, 계단식 업데이트/삭제, 감사 등과 같은 투명한 작업에 가장 적합합니다.
레코드를 어떻게 삽입합니까? 프런트 엔드 UI는 어떤 유형의 응용 프로그램입니까? – mellamokb
asp.net mvc 웹 응용 프로그램. 나는 그것을 수동으로 할 수있다. SQL-Server가 이런 행동을 단독으로 수행 할 수있는 방법이 없는가? – Jeff
그것은 어리 석음으로 복잡해지기 시작할 수 있습니다. 예를 들어 삽입 또는 삭제를 통해 단계의 순서를 바꾸려면 어떻게해야할까요? 이것은 발생하지 않으려 고하는 고통스러운 버그의 목록 일뿐입니다. PK로 RecipeStepID. 그런 다음 RecipeID 및 StepNumber에 대한 색인을 작성하십시오. –