04 | DML문을 실행한 데이터 추적
변경되거나 삭제된 데이터 추적
INSERT, UPDATE, DELETE 문은 데이터를 생성, 수정, 삭제하는 문장인데, 이들 세 문장을 실행하고 나서 어떤 데이터가 생성되었고 수정되었으며 삭제되었는지 알 수 있는 방법이 있을까? 일부는 알 수 있고 일부는 알 수 없다는 것이 정답이다. INSERT 문을 실행하면 새로운 로우가 삽입되므로 CREATION_DATE 같은 날짜 컬럼을 테이블에 추가해 놓는다면 신규로 생성된 로우를 찾을 수 있다. UPDATE문 역시 WHERE 조건과 SET 절에 명시된 컬럼을 참조하면 어떤 로우와 컬럼이 변경됐는지 찾을 수 있다. 하지만 DELETE문이 실행된 다음에는 조건에 맞는 로우 자체가 삭제되므로 WHERE 조건을 보고 간접적으로는 파악할 수는 있겠지만 정확히 어떤 데이터가 삭제됐는지 알아내기가 힘들다. INSERT나 UPDATE문 역시 WHERE 조건과 SET 절 등을 참조해 간접적으로 알 수 있을 뿐이지 어떤 데이터가 삽입되거나 수정됐는지 정확히 찾아내는 것은 그리 쉽지 않다.
예를 들어 다음과 같이 사원의 급여를 갱신하는 CH17_UPD_TEST란 프로시저를 만들어 보자.
입력
CREATE OR REPLACE ch17_upd_test_prc ( pn_emp_id NUMBER,
pn_rate NUMBER )
IS
BEGIN
-- 급여 = 급여 * pn_rate * 0.01
UPDATE employees
SET salary = salary * pn_rate * 0.01
WHERE employee_id = pn_emp_id;
DBMS_OUTPUT.PUT_LINE('사번 : ' || pn_emp_id);
DBMS_OUTPUT.PUT_LINE('급여는??? : ');
COMMIT;
END;
결과
PROCEDURE CH17_UPD_TEST_PRC이(가) 컴파일되었습니다.