트리거 강좌보고 간단한 트리거는 만들어봤는데 어떤게 효율적일지 몰라서 글을 남겨봅니다.
만드려고 하는 트리거는
데이터가 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할 때 들어갈 값들을 다 정의해서 만들어야 하는건지....
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가 이루어지기 전에 트리거에서 해당 컬럼값을 바꿔치기 해서 그런 거구요.
그런데 왜 굳이 트리거에서 해당 값을 입력하시려고 하는 건가요?
jkson님 답변 감사합니다.
답변을 보고 궁금한점이 있어 다시 질문남겨드립니다.
1. 해당 구문은 INSERT가 되기전에 원하는 컬럼(예 : insert_id, insert_dtm ... ) 등의 값들을 trigger가 실행됨으로써 원하는 값으로 변경하여 그 값들로 insert한다. 제가 생각한 부분이 맞는건가요 ?
2. 해당 컬럼에 대해서 사용자가 엑세스할수 없다는 말이 잘 이해가 가질 않습니다.
액세스 할 수 없다는 부분이 제가 INSERT나 UPDATE문 실행시 넣은 값들로 지정되지 않고 오로지 trigger에서 지정한 값들로만 처리가 되는걸 뜻하는건가요??
아니면, SELECT가 할 때 컬럼 값이 보이질 않는다던가....다른 문제가 있는건가요??
3. 입력을 하려고 하는 이유는 저도 정확하게는 잘 몰라서 재차 여쭤봐야 알 것 같습니다...
답변 감사합니다!!
4살때야 비로소 입을 열었다는 제가 언어소통능력이 좋지 못해서 윤주님을 혼돈에 빠뜨린 것 같습니다. 죄송합니다.
1.BEFORE를 사용하였으므로 말씀하신대로 원하는 값으로 변경하여 데이터를 INSERT/UPDATE하게 됩니다.
2.제어할 수 없다는 의미로 액세스라고 하였는데 다시 보니 말이 이상하네요. 말씀하신대로 저렇게 처리하면 사용자가 무슨 값을 던져주든 트리거에 지정된 값으로 INSERT/UPDATE됩니다.
제가 볼땐 트리거에서 처리할 게 아니라 입력단에서 값을 만들어서 처리하는 게 나아보입니다.
단건의 INSERT/UPDATE 경우 큰 무리가 없겠지만 대량 INSERT/UPDATE의 경우 성능적으로도 좋지 않고 굳이 이렇게 처리할 이유가 없어보이네요.