SharedIT | 묻고 답하기(AMP)

MSSQL 트리거 질문드립니다.

안녕하세요. 

자재관리 테이블에 삭제 트리거를 걸어두었습니다.

커서를 이용해서 작업을 하게 되어있는데 삭제테이블에 입력된 자료들의 SUM이 필요합니다. 

일괄삭제로 일어나기에 저는 단순하게 커서를 타기전에 select 품목 , SUM(수량) from deleted group by 품

목으로 될지 알았는데 다른 분이 그렇게 안될거라고 하시네요.

삭제 데이터에 대한 품목별 SUM 값을 산출해서 한번더 계산해주는 로직이 추가로 필요한데

품목별 합계 수량을 어떤식으로 가져와야 할까요??




 

Tags : 태그가 없습니다.

6개의 답변이 있습니다.

명동쓰레빠
  0 추천 | 11달 전

질문의 요지가 틀린거는 아닌걸로 보입니다.

select 품목 , SUM(수량) from deleted group by 품목 하면 합계 추출이 됩니다.

문제는 삭제 전에 하면 결과가  나오고 삭제 후에 하면 데이터가 없겠죠


SW대장뿡뿡이
  0 추천 | 11달 전
  • 1.삭제된 데이터의 SUM값 -> 별도테이블에 저장하는 건이라면 가능

  • 2.른 분이 그렇게 안될거라고 하시네요? -> 말씀하신대로 하면 될거 같은데 혹시 다른 조건이 있는건가요?

topkslee
  0 추천 | 12달 전

제 생각에는 트리거에서도 구현할 수 있을것 같습니다.


deleted 테이블을 cursor fetch 반복문 사용해서 임시 table에 차례대로 insert하고

끝에 원하는시 삭제된 품목 SUM 하시면 가능할 것 같습니다.

임시 table 데이터가 계속 필요하면 table 형태로 관리하고 

희발성이라면 끝에 srop하시면 될 것 같은데요.

(단, 삭제 트러기 호출을 여러건 한번에 삭제되지 않고 건별로 호출하여 

삭제할 경우는 방법이 달라져야 합니다.)


빨간신발
  0 추천 | 12달 전

아래 댓글보고 추가적으로 남겨요.

10건의 데이터를 하나의 delete로 처리하면 맞는데

1건씩 10번의 delete가 실행되는 경우라면 위의 트리거는 의미가 없을 듯 합니다.

트랜잭션 별로 삭제된 내역을 쌓아놓고 delete가 완료되면 처리하는 방식으로 진행하는데 소스를 수정하기 어려운 상황이라면

별도의 삭제이력 테이블을 두시고 트리거로 삭제되면 삭제이력에 데이터를 기록하시고, 이후 배치로 처리하는 방식도 있습니다.

빨간신발
  0 추천 | 12달 전

삭제되는 품목에 대한 수량을 기록하시려는 것인가요?

트리거로 안해도 쉬운일이라고 생각했다가..

기존에 널부러진 소스에서 누락없이 처리하려면 트리거가 맞겠네오.

https://bebeya.tistory.com/entry/MSSQL-%ED%8A%B8%EB%A6%AC%EA%B1%B0Trigger-%EC%83%9D%EC%84%B1-3%EA%B0%80%EC%A7%80-%EC%9C%A0%ED%98%95DELETE


대략 맞는거 같아요.

올리신 글처럼하시면서 조금씩 수정하면 될거같아요.


hgp33 | 12달 전

안녕하세요. 기록이 목적이 아닌 SUM값을 이용해서 내부적으로 뭔가를 추가적인 작업이 필요합니다.ㅠㅠ 말씀하신바와 같이 이미 트리거에 기타 다른 기능을 걸어둬서 이걸 이제와 변경하기에는 너무 많은 작업이 필요해서요. 

wansoo
  0 추천 | 12달 전

내용을 정확히 이해하기는 어렵지만...

delete에 대한 Trigger를 걸어 두고서 Record가 삭제되기 전에 group by를 이용한 합계를 산출해 두려고 한다는 내용인 걸로 보이는데요.

record가 삭제될 때마다 delete trigger가 작동되게 될 것인데...

삭제 되는 Record에 대한 정보를 따로 기록을 남겨 두는 것이 아닌, 

삭제되는 Record를 포함한 그룹에 대한 합계에 대한 기록을 남겨 둔다는 것이 큰 의미 있는 작업은 아닐걸로 보여지네요.

Record를 여러개 삭제한다면,

첫번째 Record가 삭제될 때 그룹에 대한 합계 정보를 남겨두고,

두번째 Record가 삭제될 때 다시 앞에 삭제된 Record가 제외된 그룹에 대한 합계 정보를 남겨 두고...

삭제라는 것은 불필요해서 제거하는 작업이 될 것 같은데...

삭제되는 Record에 대한 값이 포함된 합계 정보가 어떤 의미가 될 수 있을까 싶기도 하고요.


Table 전체를 한번에 모두 삭제시키는 목적이고,

Table에 담긴 전체 자료에 대한 합계를 남겨 두려 한다면....

Record가 하나 하나 삭제될 때마다 Trigger가 작동되어 Trigger에 의해 생성하는 Table에 Record가 반복적으로 생성되게 되기 때문에 불필요한 부하가 많이 생길 수 있을 걸로 보여지고,

최초 삭제될때 전체 합계에 대한 정보만 필요하고 나머지 뒤에 기록된 불필요한 정보들이 추가로 기록되는 효과가 있게 되어 불필요하게 저장 공간 낭비도 발생하게 될걸로 보이고요.

생성되는 Table의 record 수를 체크해서 대상 Record가 0개일때는 sum 에 대한 정보를 기록남기게하고, 1개 이상일 경우에는 sum 정보가 생성되지 않게 조건문을 달아서 Trigger를 작성하면되지 않을까 싶기도 하네요.

hgp33 | 12달 전

안녕하세요. 삭제에 대한 이력관리가 목적이 아니고 품목별 합계를 이용한 추가적인 로직이 필요한 부분입니다. 트리거 발생 조건이 데이터 삭제시 마다라고 말씀하셨는데 100건을 동시에 삭제하게 되면 트리거가 100번 동작한다는 말씀이실까요?? 만약 그렇다면 커서는 왜 필요한건지;; 트리거 발생조건이 트랜잭션을 기준으로 발생한다고 알고 있는데 100건을 동시에 삭제하면 1개의 트랜잭션 아닌가요?? SQL 너무 어렵습니다. ㅠㅠ