2013-04-12 2 views
-1

생년월일 상한선이 60이고 하한선이 20 인 방아쇠를 만드는 방법을 가르쳐 주실 수 있습니까? 나는 출퇴근을 위해 직원 연령 제한에 대한 제약이 필요합니다. 오라클 11g에있는 회사. 감사합니다생년월일 트리거 생성

+1

당신이 뭘 시도했는지, 어떤 문제인지 보니 좋겠지 만 금요일은 (바삭 바삭 고맙다) 기분이 좋다. 그래서 [이 답변] (http://stackoverflow.com/a/12364681/266304) 당신에게 좋은 출발점을 주어야합니다. –

+4

데이터가 변경되지 않고 나이가 변경되기 때문에 생년월일의 트리거로 상위 연령 제한에 대한 의미있는 제약 조건을 구현할 수 없습니다. 따라서 사람들은 무효화되지 않고 60 세가됩니다. 다른 말로하면, 여기서 가르쳐지는 것은 소프트웨어 개발 방법론이 아닌 구문 (사용자가 매뉴얼에서 얻을 수있는)입니다. –

답변

2

트리거를 사용하여 관계형 무결성을 적용하지 마십시오. 제약 조건을 사용하십시오. 그것이 바로 그들이 원하는 것입니다.

테이블 구조를 제공하는 데 어려움을 겪지 않으므로 실제 테이블에 맞게 조정해야합니다. 당신의 employees 테이블이 hire_date 열이 부족한 경우

alter table employees 
    add constraint minimum_age_ck check 
     (hire_date >= add_months(date_of_birth, 240); 

alter table employees 
    add constraint maximum_age_ck check 
     (hire_date <= add_months(date_of_birth, 720); 

은 물론, 당신은 큰 문제가있어.

+0

훌륭한 솔루션입니다. * 트리거를 사용하지 마십시오. * 항상가는 길입니다! – haki

+0

@ APC 직원이 회사와 여러 개의 고용 기간을 가질 수 있으므로 채용일은 어쨌든 다른 테이블에 있어야합니다. –

-1

감사합니다. 드디어 값을 삽입하는 시도하고 제약이 유효한지 확인합니다이

alter table staff 
    add constraint minimum_age_ck check 
     ((dateOfBirth >= add_months(dateOfBirth, -18))); 

alter table staff 
    add constraint maximum_age_ck check 
     ((dateOfBirth <= add_months(date_of_birth, 60))); 

을 사용했다.

한편 값을 삽입하여 위의 대답을 확인한 결과 유효하지 않음이 판명되었습니다. 나도 이걸 사용해 보았습니다 테이블 직원을 변경하십시오 최소 제약 조건을 지정하십시오 minimum_age_ck CHECK ((months_between (sysdate, dateOfBirth)> = 240)); CHECK ((MONTHS_BETWEEN (SYSDATE, 생년월일 (DateOfBirth))> = 240)) 라인 3에서 * ERROR : ORA-02436 : 잘못 CHECK 제약에 지정된 날짜 또는 시스템 변수

는 MONTHS_BETWEEN 대한 유효한 가능한 비교 SYSDATE인가 ?

+0

check 제약 조건에서 sysdate를 사용할 수 없습니다. 귀하의 질문에 대한 논평으로 검사 제약 조건은 데이터가 변경 될 때만 평가되므로 모든 데이터가 제약 조건을 통과하지는 못하기 때문에 제약 조건에서 sysdate를 사용할 수 없습니다. 귀하의 코드에서 "dateOfBirth", 열의 이름이 "date_of_birth"이라면 무엇입니까? 그들이 동일하다면 첫 번째 제한은 출생의 대가가 그 자체보다 18 개월 이상이어야하며, 항상 그렇듯이 60 개월보다 60 개월 미만이어야한다는 것입니다. 이는 항상 그렇습니다. 이 접근법은 모두 잘못되었습니다. –

+0

David Aldridge 감사합니다. 이 수표를 얻기 위해 어떻게 구조화 될 수 있습니까? – user2282435