프로젝트의 기록을 추적하기 위해 시스템 작업 중입니다. 주 테이블에는 프로젝트, 작업 및 클라이언트라는 세 개의 테이블이 있으며 각 테이블에 대해 세 개의 히스토리 테이블이 있습니다. 프로젝트 테이블에 다음과 같은 트리거가 있습니다.오라클 및 히스토리 만들기
CREATE OR REPLACE TRIGGER mySchema.trg_projectHistory
BEFORE UPDATE OR DELETE
ON mySchema.projects REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
declare tmpVersion number;
BEGIN
select myPackage.GETPROJECTVERSION(:OLD.project_ID) into tmpVersion from dual;
INSERT INTO mySchema.projectHistiry
(project_ID, ..., version)
VALUES
(:OLD.project_ID,
...
tmpVersion
);
EXCEPTION
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END ;
/
각 테이블 (프로젝트, 작업, 클라이언트)마다 3 개의 트리거가 있습니다.
여기에 도전 과제가 있습니다. 동시에 모든 것이 변경되는 것은 아닙니다. 예를 들어 누군가 특정 업무의 비용 만 업데이트 할 수 있습니다. 이 경우 하나의 트리거 만 실행되고 하나의 삽입이 발생합니다. 한 번에 3 개의 기록 테이블에 하나의 레코드를 삽입하고 싶습니다. 아무 것도 프로젝트 및 클라이언트 테이블에서 변경되지 않은 경우에도 마찬가지입니다.
누군가가 프로젝트의 end_date, 비용을 변경하고 다른 클라이언트를 선택하면 어떻게 될까요? 이제는 동시에 세 개의 트리거가 실행됩니다. 이 경우에만 세 개의 기록 테이블에 하나의 기록이 삽입됩니다. (원하는)
첫 번째 예제에서는 3 개의 테이블에 삽입 할 트리거를 수정하면 두 번째 예제가 발생할 때 9 개의 삽입이 생깁니다.
이 문제를 해결할 방법이 확실하지 않습니다. 어떤 도움?
사실,하지만 직면 한 다른 문제는 작업 기록이지만 프로젝트/클라이언트 기록은 없습니다. 나는 join을 알아 내야 만한다 : x_history에 아무것도 없다면, x에서 그것을 얻는다. – CFNinja
글쎄요,이 경우, 히스토리 테이블에 활성 버전과 비활성 버전을 둘 다 사용해 볼 수 있습니까? 이 접근법의 단점은 작업 테이블의 현재 레코드를 업데이트 할 때마다 기록의 최신 레코드를 업데이트 한 다음 새 레코드를 삽입해야한다는 것입니다. –
히스토리 테이블에는 비활성 버전 만 포함됩니다. 주 테이블에 대한 모든 갱신/삭제로 인해 비활성 실행 기록 버전이 작성됩니다. 후자는 어떻게합니까? x_history에 아무것도없는 경우 x에서 가져옵니다. – CFNinja