A테이블의 정보를 update 후
A테이블의 정보를 update 한 뒤, history테이블에 update정보를 insert 해야했다.
여기서 문제는 update 전 정보와 후 정보를 함께 insert해야했다.
여러가지 상황들로 인하여 trigger사용이 힘들었기 때문에 sql문 1개로 update와 insert 하는 법을 궁리해보았다.
<A 테이블>
문서번호 | 문서상태 | 문서내용 |
---|---|---|
1 | 작성완료 | abcd |
2 | 작성중 | 1234 |
3 | 작성중 | 가나다라 |
4 | 삭제 | 99999 |
<B 테이블>
문서번호 | 유저번호 | 블로그고유번호 | 카테고리번호 |
---|---|---|---|
1 | 1001 | VEL00001 | 001 |
2 | 1002 | VEL00002 | 001 |
3 | 1001 | VEL00001 | 003 |
3 | 1001 | VEL00001 | 001 |
<History 테이블>
History시퀀스 | 문서번호 | 변경 전 문서상태 | 변경 후 문서상태 | 비고 |
---|---|---|---|---|
1 | 1 | 작성중 | 작성완료 |
문서상태가 변경될 때마다 History테이블에 변경정보가 insert 되어야한다.
유저정보 1001의 '작성중'상태의 문서를 모두 '삭제'로 변경하는 쿼리이다.
WITH prev AS (
SELECT
A.문서번호
, A.문서상태
FROM A
INNER JOIN B
ON A.문서번호 =B.문서번호
WHERE A.문서상태 ='작성중'
), cur AS (
UPDATE A
SET 문서상태 = '삭제'
WHERE 문서번호 IN (SELECT 문서번호 FROM prev)
RETURNING 문서번호 , 문서상태
) INSERT INTO = History (
문서번호
, 변경 전 문서상태
, 변겅 후 문서상태
, 비고)
SELECT
cur.문서번호
, prev.문서상태
, cur.문서상태
, '유저 직접 변경'
FROM cur, prev
WHERE cur.문서번호 = prev.문서번호;
무분별한 with문 사용을 최대한 줄이는 노력을 하고 있는데 동일한 정보를 가지고 update와 insert를 한번에 하려고 하니 with문을 사용할 수 밖에 없었다.
추후 더 좋은 쿼리가 생각나면 수정하는 방향으로 가야겠다.