TRIGGER 질문입니다. 0 4 2,590

by 모델장윤주 [2017.01.25 14:44:23]


트리거 강좌보고 간단한 트리거는 만들어봤는데 어떤게 효율적일지 몰라서 글을 남겨봅니다.

만드려고 하는 트리거는

데이터가 insert되거나, update될 때

insert_id, insert_time 혹은 update_id, update_time을 트리거로 넣으려고 합니다.

 

insert_id에는 현재 접속한 DB 계정

insert_time에는 sysdate ( update_id, update_time 또한 마찬가지입니다. )

 

그런데 BEFORE을 해야할지 AFTER를 해야할지 잘 모르겠네요

BEFORE를 하고 실질적으로 INSERT나 UPDATE하기전에 INSERT_ID, INSERT_TIME.. 이런 값들을 임의로 바꾼다고 하면

INSERT가 이뤄지고 BEFORE 작업 후에 또 INSERT가 실행이 되는건가요 ??

AFTER를 한다면, INSERT나 UPDATE가 되고나서 한번 더 UPDATE를 해야 하는 거 같고...

 

만약 BEFORE로 하는게 효율적이라면 저 구문을 어떤 부분을 참고해서 만들어야 하나요 ???

INSERT할 때 들어갈 값들을 다 정의해서 만들어야 하는건지....

by jkson [2017.01.25 15:19:49]

AFTER에서 하시면 오류 날 거구요.

(ORA-04084: 이 트리거 유형에 트리거 NEW 값을 변경할 수 없습니다)

BEFORE에서 다음과 같이 하시면 됩니다.

CREATE OR REPLACE TRIGGER TMP_20170125_TR
BEFORE INSERT OR UPDATE
ON TMP_20170125 
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
BEGIN
   
   IF INSERTING THEN
      :NEW.INSERT_ID:= 'TMP';--DB계정이 뭘 말하시는 건지? SELECT해서 여기 넣어주세요.
      :NEW.INSERT_TIME:= SYSDATE;
   ELSIF UPDATING THEN
      :NEW.UPDATE_ID:= 'TMP';
      :NEW.UPDATE_TIME:= SYSDATE;
   END IF;

   EXCEPTION
     WHEN OTHERS THEN
       RAISE;
END ;

그런데 이렇게 하시면 해당 컬럼에 대해서는 사용자가 액세스할 수가 없어요.

실질적인 INSERT나 UPDATE가 이루어지기 전에 트리거에서 해당 컬럼값을 바꿔치기 해서 그런 거구요.

그런데 왜 굳이 트리거에서 해당 값을 입력하시려고 하는 건가요?


by 모델장윤주 [2017.01.25 17:36:44]

jkson님 답변 감사합니다.

답변을 보고 궁금한점이 있어 다시 질문남겨드립니다.

1. 해당 구문은 INSERT가 되기전에 원하는 컬럼(예 : insert_id, insert_dtm ... ) 등의 값들을 trigger가 실행됨으로써 원하는 값으로 변경하여 그 값들로 insert한다. 제가 생각한 부분이 맞는건가요 ?

2. 해당 컬럼에 대해서 사용자가 엑세스할수 없다는 말이 잘 이해가 가질 않습니다.

액세스 할 수 없다는 부분이 제가 INSERT나 UPDATE문 실행시 넣은 값들로 지정되지 않고 오로지 trigger에서 지정한 값들로만 처리가 되는걸 뜻하는건가요??

아니면, SELECT가 할 때 컬럼 값이 보이질 않는다던가....다른 문제가 있는건가요??

3. 입력을 하려고 하는 이유는 저도 정확하게는 잘 몰라서 재차 여쭤봐야 알 것 같습니다...

 

답변 감사합니다!!

 


by jkson [2017.01.25 17:55:25]

4살때야 비로소 입을 열었다는 제가 언어소통능력이 좋지 못해서 윤주님을 혼돈에 빠뜨린 것 같습니다. 죄송합니다.

1.BEFORE를 사용하였으므로 말씀하신대로 원하는 값으로 변경하여 데이터를 INSERT/UPDATE하게 됩니다.

2.제어할 수 없다는 의미로 액세스라고 하였는데 다시 보니 말이 이상하네요. 말씀하신대로 저렇게 처리하면 사용자가 무슨 값을 던져주든 트리거에 지정된 값으로 INSERT/UPDATE됩니다.

제가 볼땐 트리거에서 처리할 게 아니라 입력단에서 값을 만들어서 처리하는 게 나아보입니다.

단건의 INSERT/UPDATE 경우 큰 무리가 없겠지만 대량 INSERT/UPDATE의 경우 성능적으로도 좋지 않고 굳이 이렇게 처리할 이유가 없어보이네요.

 


by 모델장윤주 [2017.01.26 09:01:04]

jkson님 답변 감사합니다.

설명을 잘해주셨는데 제가 이해를 잘 하지 못한 부분으로 인해서 재차 여쭤본거였습니다 ㅠㅠ

이해가 부족한 제 탓이예요 ㅠㅠ

+ 저도 입력단에서 처리하는게 훨씬 나아보이는데.. ( 지금껏 그렇게 하기도 했었구요 )

도움 답변 너무너무 감사합니다!!!

 

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