생년월일 상한선이 60이고 하한선이 20 인 방아쇠를 만드는 방법을 가르쳐 주실 수 있습니까? 나는 출퇴근을 위해 직원 연령 제한에 대한 제약이 필요합니다. 오라클 11g에있는 회사. 감사합니다생년월일 트리거 생성
답변
트리거를 사용하여 관계형 무결성을 적용하지 마십시오. 제약 조건을 사용하십시오. 그것이 바로 그들이 원하는 것입니다.
테이블 구조를 제공하는 데 어려움을 겪지 않으므로 실제 테이블에 맞게 조정해야합니다. 당신의 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);
은 물론, 당신은 큰 문제가있어.
훌륭한 솔루션입니다. * 트리거를 사용하지 마십시오. * 항상가는 길입니다! – haki
@ APC 직원이 회사와 여러 개의 고용 기간을 가질 수 있으므로 채용일은 어쨌든 다른 테이블에 있어야합니다. –
감사합니다. 드디어 값을 삽입하는 시도하고 제약이 유효한지 확인합니다이
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인가 ?
check 제약 조건에서 sysdate를 사용할 수 없습니다. 귀하의 질문에 대한 논평으로 검사 제약 조건은 데이터가 변경 될 때만 평가되므로 모든 데이터가 제약 조건을 통과하지는 못하기 때문에 제약 조건에서 sysdate를 사용할 수 없습니다. 귀하의 코드에서 "dateOfBirth", 열의 이름이 "date_of_birth"이라면 무엇입니까? 그들이 동일하다면 첫 번째 제한은 출생의 대가가 그 자체보다 18 개월 이상이어야하며, 항상 그렇듯이 60 개월보다 60 개월 미만이어야한다는 것입니다. 이는 항상 그렇습니다. 이 접근법은 모두 잘못되었습니다. –
David Aldridge 감사합니다. 이 수표를 얻기 위해 어떻게 구조화 될 수 있습니까? – user2282435
당신이 뭘 시도했는지, 어떤 문제인지 보니 좋겠지 만 금요일은 (바삭 바삭 고맙다) 기분이 좋다. 그래서 [이 답변] (http://stackoverflow.com/a/12364681/266304) 당신에게 좋은 출발점을 주어야합니다. –
데이터가 변경되지 않고 나이가 변경되기 때문에 생년월일의 트리거로 상위 연령 제한에 대한 의미있는 제약 조건을 구현할 수 없습니다. 따라서 사람들은 무효화되지 않고 60 세가됩니다. 다른 말로하면, 여기서 가르쳐지는 것은 소프트웨어 개발 방법론이 아닌 구문 (사용자가 매뉴얼에서 얻을 수있는)입니다. –