2014-05-22 3 views
0

강사의 일원으로 '전체'등급의 교수를 2 명 이상 허용하지 않는 트리거를 작성했습니다 (예 : 새로운 (세 번째) 전체 교수가 추가되거나 트리거되면 트리거해야 함) 기존의 Associate 교수 중 한 명에게 Full로 업데이트됩니다.)트리거가 삽입을 허용하지 않습니다

컴파일은되지만 내 테이블에 데이터를 추가하는 것을 알려주지 않습니다. 한 번만 사용하면됩니다. 이에 대한 진술 수준 트리거를 사용합니까? 또한 현재로서는 Full이나 Associate인지 여부에 관계없이 Rank 교수를 업데이트하거나 삽입하지 않습니다. 어떻게 수정하겠습니까?

나는 또한 이전과 이후에 비교 논리가 잘못되었다는 말을 들었습니다. 도와주세요!

CREATE OR REPLACE TRIGGER TRG_PROF_RANK 
after insert or update of F_RANK 
on FACULTY 

DECLARE 
FULL_RANK_COUNT integer; 
MAX_FULL_RANK_COUNT number :=2; 

begin 
select count(*) into FULL_RANK_COUNT 
from FACULTY 
where F_RANK ='Full'; 

if FULL_RANK_COUNT < MAX_FULL_RANK_COUNT 
then 
return; 
else 

if (FULL_RANK_COUNT >= MAX_FULL_RANK_COUNT) then 
RAISE_APPLICATION_ERROR (-20000, 'Can only have 2 professors with ranking "Full".'); 
end if; 
end if; 
end; 
/

나는 다음과 같은 문으로 테스트 : 여기

트리거입니다

insert into FACULTY values(6, 'John', 'Bonny', 'M', 13, '4079347153', 'Associate', 80000, 2, 6034, Null); 

을하지만 그것은 나를 테이블에있는 레코드를 삽입 할 수 없습니다.

Error starting at line : 240 in command - 
insert into FACULTY values(6, 'John', 'Bonny', 'M', 13, '4079347153', 'Associate', 80000, 2, 6034, Null) 
Error report - 
SQL Error: ORA-20000: Can only have 2 professors with ranking "Full". 
ORA-06512: at "IT337104.TRG_PROF_RANK", line 16 
ORA-04088: error during execution of trigger 'IT337104.TRG_PROF_RANK' 
20000. 00000 - "%s" 
*Cause: The stored procedure 'raise_application_error' 
      was called which causes this error to be generated. 
*Action: Correct the problem as described in the error message or contact 
      the application administrator or DBA for more information. 

난 그냥 내가 데이터를 삽입 할 수 있는지 확인하기 위해, 도와주세요 : 그리고 이것은 내가 오류입니다.

는 트리거가 전혀 실행하지 말아야 있도록

+0

'> ='당신이 필요로하는 곳은'>'입니다. 또한 이미 테이블에 2 명 이상의 전체 교수가있을 수 있습니다. 삽입 된 교수가 가득 차 있지 않은 경우에도 조건이 실행됩니다. 'references as new as'절 (또는 Oracle SQL의 동급)을 사용하고 새로 삽입 된 레코드가 '전체'교수인지 여부를 확인할 수 있습니다. Full에서 Associate 로의 변경은 항상 유효해야합니다 (이 트리거에 따르면, 다른 트리거는 항상 열성적인 교수가 적어도 한 명 있다고 주장 할 수 있지만, 아마도 과도하게 열심입니다). –

답변

0

쿼리는 돌연변이 테이블 오류가 발생한다 감사드립니다. 해당 테이블에 기록 된 트리거 내에서 테이블을 쿼리 할 수 ​​없습니다. 삽입 또는 업데이트를 실행하기 전에 다른 곳에서 전체 교수직 수를 유지하거나 응용 프로그램 코드에서 테스트를 수행해야합니다. 이것은 UNIQUE 제약 조건을 제외하고 같은 테이블의 다른 행에있는 데이터에 의존하는 데이터 무결성 검사의 문제점입니다. 이 테이블의 트리거에서 수행 할 수 없습니다.

하지만 가능한 경우에도 주요 논리 오류가 있습니다. 테이블에 두 명의 교수가 이미 포함되어있는 경우이 트리거는 모두 삽입물과 업데이트가 전체 교수자와 관련되지 않은 경우에도 금지합니다.

하지만 모두 손실되지 않습니다. 논리 결함을 수정하는 경우 트리거를 각 행에 대해 before 트리거로 설정하고 :new.F_RANK의 내용을 검토 한 다음 그에 따라 조치하십시오. 조사하려는 해결책 중 하나는 Oracle; limit rows per column value입니다. (처음이 아닌 구체화 된보기의 두 번째 대답)

관련 문제