라르게덴님의 트리거 강좌를 숙독하고 열심히 응용해보고 있는데요.
(역시나 트리거 없는 대상에서 트리거 만들기는 어렵더군요ㅎ)
member 모듈에서 insert, update, delete 실행에 따라, 요즘 제작 중인 user 모듈(nick_name과 user_name의 자소 분리 문자열을 별도의 테이블에 담고 있어요)에도 반영을 하고 있습니다.
근데 이 놈의 욕심 때문에ㅋ 사용자정의(extra_vars)도 변수별로 자소 분리를 해서 테이블에 담는 것까지도 성공을 했어요.
사용자정의 대상으로도 자동완성 검색을 해서 회원 검색이 가능하도록 해보려구요.
다행히 insertMember, deleteMember에도 잘 반응하고 있습니다만, 유독 updateMember에 대해서만 동작이 어렵네요.
public function triggerUpdateMember($obj) // 호출시점은 before { $oUserModel = getModel('user'); $args = new stdClass(); $args->member_srl = $obj->member_srl; $orgMemberInfo = executeQuery('member.getMembers', $args)->data; if ( $orgMemberInfo->user_name != $obj->user_name || $orgMemberInfo->nick_name != $obj->nick_name || $orgMemberInfo->extra_vars != $obj->extra_vars ) { $args = new stdClass(); $args->member_srl = $obj->member_srl; $args->user_name = $oUserModel->getDissemble($obj->user_name); // getDissemble()은 한글 체크 후 자소 분리를 해주는 함수 $args->nick_name = $oUserModel->getDissemble($obj->nick_name); $args->type = 'update'; $this->handleUser($args); // handleUser()는 $args->type에 따라 rx_user 테이블을 핸들링(삽입, 수정, 삭제)해주는 함수 } else { return; } }
이렇게 해서 기존의 extra_vars값과 새로 수정된 extra_vars값이 다를 경우, DB에 반영이 되도록 했어요.
nick_name이나 user_name에 변화가 있을 경우엔 잘 반영이 되거든요.
근데 회원정보에서 사용자정의값만 수정했을 경우에는 이게 반응을 안 하더라구요.
정확히 말하자면, 사용자정의값을 두 번 수정할 때 첫 번째 수정된 값만 반영됩니다;;;
(무슨 말인지 헷갈리시죠? 저도 도통 잘 이해가 안 되는 로직이에요ㅠ)
extra_vars가 직렬화된 데이터여서 그런 건지, 트리거 호출 시점을 after로 따로 하나 더 해야 하는 건지, 답답하네요.
결론 : 이렇게 하소연하고 나면 문제가 해결되는 경우가 있어서, 하소연 남기고 문제해결을 기도해봅니다ㅜ
음... 굳이 before에서 처리해야 하는 이유가 있나요?
기존의 extra_vars와 수정된 데이터의 extra_vars 값이 달라졌는지 확인하기 위해 그러신 것 같은데,
기존의 값을 읽어와서 비교하는 것이나, 읽지 않고 무조건 덮어쓰기 하는것이나,
결과적으로 받는 DB 부하는 비슷할 것 같은데요..!
읽어 왔을때 수정이 필요하지 않다면, 읽기 한번만 하면 되지만, 그게 아니라면 읽기/쓰기 두번의 쿼리가 실행되니 오히려 손해가 아닐까요...?
그 뿐만 아니라, before에서 처리를 하면,
몇몇 조건에 의해 정보 수정이 진행되지 않았을 경우(금지닉네임, IP차단 등)에도,
트리거가 작동하기 때문에, 실제로 수정될 것인지 아닌지를 한번 더 체크해야 할거 같은데요...!
정확히 어떤 결과를 원하시는지 몰라서...
제가 관련 트리거를 사용한 기능을 제작할 때의 경험을 말씀드리는겁니다..!
윤삼님 경우와는 다를수 있어요.