안녕하세요? 초보 에퀴페입니다.
트리거를 만들다가 안되는 부분이 있어서 문의를 드립니다.
다음은 테이블 생성, 트리거 생성, 데이터 입력 스크립트입니다.
CREATE TABLE MYTEST(
SEQ int IDENTITY(1,1) NOT NULL,
C_DATE date NOT NULL,
RET char(1) NOT NULL,
E_DATE date NULL,
CONSTRAINT PK_MYTEST PRIMARY KEY CLUSTERED(SEQ ASC)
)
go
CREATE TRIGGER TR_MYTEST_E_DATE
ON MYTEST
AFTER INSERT, UPDATE
AS
DECLARE @varSeq int
DECLARE @varCdate date
DECLARE @varRet char(1)
BEGIN
SELECT @varSeq = SEQ, @varCdate = C_DATE, @varRet = RET FROM INSERTED
IF UPDATE (RET)
BEGIN
IF @varRet = 'A'
BEGIN
UPDATE MYTEST SET E_DATE = DATEADD(Year, 1, C_DATE) WHERE SEQ = @varSeq
END
ELSE IF @varRet = 'B'
BEGIN
UPDATE MYTEST SET E_DATE = DATEADD(Year, 2, C_DATE) WHERE SEQ = @varSeq
END
ELSE IF @varRet = 'C'
BEGIN
UPDATE MYTEST SET E_DATE = DATEADD(Year, 3, C_DATE) WHERE SEQ = @varSeq
END
ELSE IF @varRet = 'D'
BEGIN
UPDATE MYTEST SET E_DATE = DATEADD(Year, 4, C_DATE) WHERE SEQ = @varSeq
END
END
END
go
INSERT INTO MYTEST (C_DATE, RET) VALUES ('20000101', 'A')
go
INSERT INTO MYTEST (C_DATE, RET) VALUES ('20000101', 'B')
go
INSERT INTO MYTEST (C_DATE, RET) VALUES ('20000101', 'C')
go
스크립트에서 보시다시피 RET의 값에 따라 C_DATE에 일정한 값을 더해 E_DATE를 설정하는 트리거입니다.
조회해 보면 아래와 같이 정상적으로 E_DATE 값이 설정됩니다.
SEQ C_DATE RET E_DATE
-------------------------------
1 2000-01-01 A 2001-01-01
2 2000-01-01 B 2002-01-01
3 2000-01-01 C 2003-01-01
그런데 문제는 업데이트 되는 Row 가 2개 이상인 경우 첫번째 Row만 트리거가 적용되고 나머지 Row는 적용되지 않습니다.
UPDATE MYTEST SET RET = 'D'
위 쿼리를 실행한 후 조회하면 다음과 같습니다.
SEQ C_DATE RET E_DATE
-------------------------------
1 2000-01-01 D 2004-01-01
2 2000-01-01 D 2002-01-01
3 2000-01-01 D 2003-01-01
이 문제를 해결하려면 어떻게 해야 할까요?
고견을 부탁드립니다.
감사합니다.
SELECT @varSeq = SEQ, @varCdate = C_DATE, @varRet = RET FROM INSERTED
을 보시면 업데이트가 여러건이 들어 와도 변수에는 하나의 값( 마지막값 하나만 들어갑니다.)
커서를 써서 하나씩 읽어서 처리를 하시던 조인을 이용해서 한꺼번에 처리를 하시는 방법으로 하셔야 합니다.
변수에 값을 받는 방식을 한로우씩 작업을 날리는 방식일 경우에는 가능 하지만 일괄로 업데이트를 날릴 경우는 힘듦니다...
UPDATE b
SET E_DATE = (case a.ret
when 'A' then DATEADD(Year, 1, C_DATE)
when 'B' then DATEADD(Year, 2, C_DATE)
when 'C' then DATEADD(Year, 3, C_DATE)
when 'D' then DATEADD(Year, 4, C_DATE)
end )
FROM INSERTED a join MYTEST on a.SEQ = b.SEQ