2012-12-04 6 views
0

두 테이블 tblapplication 및 tblapplicationhistory가 있습니다. tblapplicationhistory는 응용 프로그램 테이블의 응용 프로그램 상태에 대한 모든 변경 사항의 아카이브입니다. 응용 프로그램 테이블의 학생은 많은 응용 프로그램을 가질 수 있습니다.오라클 업데이트 후 트리거가 올바르게 수행되지 않습니다.

응용 프로그램 상태가 "제공 허용"이되면 상태 ID는 7로 설정됩니다. 그러면 응용 프로그램 및 응용 프로그램 기록 테이블에 모두 반영됩니다. 이 시점에서 해당 학생의 다른 모든 신청 상태는 8, "거부 제안"으로 설정되어야합니다.

create or replace 
TRIGGER trg_declineapplications AFTER UPDATE ON tblapplicationhistory FOR EACH ROW 

BEGIN 
    IF :NEW.statusid_fk_nn = 7 THEN 
     UPDATE tblapplication 
     SET statusid_fk_nn = 8 
     WHERE studentrecordnumber_fk_nn = (SELECT studentrecordnumber_fk_nn 
              FROM tblapplication 
              WHERE applicationid_pk_nn = :NEW.applicationid_fk_nn 
             ) 
     AND applicationid_pk_nn != :NEW.applicationid_fk_nn; 
    END IF; 
END; 

트리거는 오류없이 컴파일되고 트리거는 SQL 오류를 반환하지 않고 활성화되지만 응용 프로그램 테이블의 모든 행에 대해 계산을 수행하지 않습니다. 이 경우 트리거 논리에 오류가 있어야하지만 표시되지 않습니다.

내 생각에 tblapplicationhistory의 업데이트 된 행에 statusID 7이 포함되어 있으면 승인 된 응용 프로그램과 다른 학생에게 속한 모든 응용 프로그램에 대해 statusID를 8로 설정하여 응용 프로그램 테이블에 대한 업데이트가 수행됩니다.

필요한 경우 자세한 정보를 제공 할 수 있습니다.

테이블 정의 : tblapplication에서

tblapplication: 
applicationid_pk_nn 
studentrecordnumber_fk_nn 
jobid_fk_nn 
statusid_fk_nn 

tblapplicationhistory: 
applicationid_fk_nn 
statusid_fk_nn 
datechanged_nn 
applicationhistoryid_pk_nn 

, 기본 키는 applicationid_pk_nn이고 다른 모든 필드는 외래 키입니다.

tblapplicationhistory에서 applicationhistoryid_pk_nn이 기본 키입니다. statusid_fk_nn은 applicationid_fk_nn이있는 tblapplication에서 검색됩니다.

+3

'경우 'tblApplicationHistory'에'UPDATE'가 있을까요? 'tblApplicationHistory'는'INSERT' 연산에 의해서만 채워지지 않을까요? 그렇다면'AFTER UPDATE' 트리거는 절대 실행되지 않습니다. –

+0

아주 좋은 지적. 보시다시피 저는 초보자입니다. 나머지 방아쇠가 올바른 것처럼 보이나요? –

+0

글쎄, 유효한 구문처럼 보입니다. 구조 테이블에서 트리거를 사용하여 기본 테이블을 수정하는 것은 다소 이상한 것처럼 보입니다. (아마도 이력 테이블에 여러 행이 생성 될 것입니다.) 그런 종류의 논리는 일반적으로 저장 프로 시저 API에서 트리거 밖에서 훨씬 더 의미가 있습니다. –

답변

1

트리거 방법이 매우 강건 해 보이지 않습니다.

응용 프로그램 허용 설정 레코드를 업데이트 할 때에 대해 /이 같은 일을 거부하는 방법

: tblApplicationHistory`이 tblApplication`, 왜`의 행에 만들어진 모든 변화의 아카이브가

update my_table 
set status_id = case my_table.application_id 
         when application_id_for_accepted_offer then 7 
         else 8 
        end 
where student_id = student_id_to_update; 
+0

고마워, 나는 완전히 사건을 사용하는 것을 잊어 버렸다. 내가 줄 수 있다면 upvote 줄 :) –

관련 문제