MS SQL 트리거 작성중에 궁금증이 있어 글씁니다 0 5 841

by 김삼촌 [2017.03.14 14:10:49]


ALTER TRIGGER [dbo].[TR_SG_ORD_DETAIL_UPDATE] ON [dbo].[SG_ORD_DETAIL]

AFTER UPDATE

AS

SET NOCOUNT ON
declare 
@upd_uno varchar(20),  @sale_no varchar(10), @sale_seq numeric(18,0), @wDate varchar(10), @WAIT_FLAG varchar(10),  @CNT_DEL INTEGER ,@CNT_INS INTEGER

SELECT @CNT_DEL = COUNT(*) FROM DELETED 
SELECT @CNT_INS = COUNT(*) FROM INSERTED 

SELECT @WAIT_FLAG = WAIT_FLAG
         , @sale_no = sale_no
	 , @sale_seq = SALE_SEQ
	 , @upd_uno = upd_uno
	 , @wDate = CONVERT(VARCHAR(10), GETDATE(),112)
  FROM inserted

IF @CNT_DEL > 0 AND @CNT_INS > 0 AND @WAIT_FLAG = '0'

BEGIN
   UPDATE [dbo].[SG_ORD_DETAIL]
      SET WAIT_UPD_UNO = @upd_uno
	    , WAIT_UPD_DTM = @wDate
	WHERE sale_no = @sale_no 
	  and SALE_SEQ = @sale_seq
END

SET NOCOUNT OFF

 

위는 쿼리구요

특정컬럼이 1에서 0으로 업데이트되면 같은 테이블의 다른 두 컬럼을 업데이트 하는 트리거를 작성중입니다

그런데 트리거가 반응이 없네요...

insert, delete 는 찾아도 잘 나오는데 업데이트문은 잘나오지도 않구요

미리 감사의 말씀 드리겠습니다

 

---추가설명

SG_ORD_DETAIL 테이블 WAIT_FLAG 라는 컬럼이 1에서 0으로 업데이트 될때 트리거가 걸려서

동일 테이블에 있는 WAIT_UPD_UNO(업데이트유저) 와  WAIT_UPD_DTM(업데이트날자) 컬럼이

업데이트 되는 트리거 입니다


 

 

 

 

 

by 마농 [2017.03.15 16:52:21]

업데이트 유저는 기존 유저 그대로 업데이트 하는게 맞나요?
그럴거면 아예 안하는게 맞을 듯.

ALTER TRIGGER dbo.tr_sg_ord_detail_update
ON dbo.sg_ord_detail
AFTER UPDATE
AS
BEGIN
    UPDATE dbo.sg_ord_detail
       SET wait_upd_dtm = CONVERT(VARCHAR(10), GETDATE(), 112)
      FROM dbo.sg_ord_detail t
     INNER JOIN inserted     i
        ON t.sale_no   = i.sale_no
       AND t.sale_seq  = i.sale_seq
       AND i.wait_flag = '0'
END
GO

 


by 김삼촌 [2017.03.16 10:23:09]

업데이트 유저는 wait_flag 를 업데이트 할때 그 유저를 남겨놓기 위한 것입니다

그러므로 wait_flag 를 업데이트 한 그시점에 유저를 그대로 박는것입니다

정말 감사합니다 ^^테스트 후 채택하겠습니다

---

테스트 전이긴한데 정말 깔끔한 sql문이네요

Inserted라는 것이 테이블로 인지되어 이너조인한것만으로도 많은걸 배울수있었습니다

감사합니다


by 김삼촌 [2017.03.16 12:04:14]

아...그런데 왜안될까요ㅜㅠ 트리거가 안타는거같네요

테스트중인데 업데이트 되야할 곳이 둘다 null로 되있습니다...


by 마농 [2017.03.16 13:26:22]

테스트 해봤는데 잘 되네요.

-- 1. 테이블 생성
CREATE TABLE test(idx DECIMAL(2) PRIMARY KEY, flag VARCHAR(1), reg_dt VARCHAR(8));
-- 2. 데이터 입력
INSERT INTO test VALUES(1, '1', null);
INSERT INTO test VALUES(2, '1', null);
INSERT INTO test VALUES(3, '1', null);
-- 3. 트리거 생성
CREATE TRIGGER tr_test
ON test
AFTER UPDATE
AS
BEGIN
    UPDATE test
       SET reg_dt = CONVERT(VARCHAR(10), GETDATE(), 112)
      FROM test t
     INNER JOIN inserted i
        ON t.idx = i.idx
       AND i.flag = '0'
END
GO
-- 4. Flag 변경
UPDATE test SET flag = '0' WHERE idx <= 2;
-- 5. 결과 확인
SELECT * FROM test;
idx	flag	reg_dt
1	0	20170316
2	0	20170316
3	1	NULL

 


by 김삼촌 [2017.03.16 14:26:43]

감사합니다 되네요!

쿼리문 내에선 되는데 프로그램내에선 안되는게 좀 이상하긴한데

아무튼 되니까 정말 감사합니다!!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입