2013-04-12 127 views
-1

請有人啓發我如何創建具有60的上限和20的下限的觸發器。我正在處理一項任務,該任務需要限制運輸的員工年齡範圍公司在oracle 11g上。謝謝爲出生日期創建觸發器

+1

這將是很高興看到你已經嘗試過什麼,你有什麼問題,但它是星期五(謝謝你),我感到慷慨,所以[這個答案](http://stackoverflow.com/a/12364681/266304)應該給你一個很好的起點。 –

+4

由於年齡變化而數據並未發生變化,因此您無法對出生日期的上限作爲觸發條件實施有意義的限制。因此,人們變成60歲,沒有失職提出。換句話說,這裏教的是語法(可以從手冊中獲得),而不是任何類型的軟件開發方法。 –

回答

2

不要使用觸發器來強制關係完整性,使用約束。這就是他們的目的。

你沒有爲自己提供表結構而煩惱,所以你需要爲你的實際表調整它。

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); 

當然,如果你的employees表缺少一個hire_date列你有一個很大的問題。

+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))); 

將嘗試插入值和檢查約束是有效的。

同時通過插入值檢查上述答案證明它是無效的。我也試過使用這個 ALTER TABLE STAFF ADD CONSTRAINT minimum_age_ck CHECK((months_between(sysdate,dateOfBirth)> = 240)); CHECK((MONTHS_BETWEEN(SYSDATE,DATEOFBIRTH)> = 240)) * ERROR位於第3行: ORA-02436:在CHECK約束錯誤地指定的日期或系統變量

是SYSDATE不是MONTHS_BETWEEN有效可用比較?

+0

您無法在檢查約束中使用sysdate。正如我對你的問題所評論的那樣,檢查約束只在數據改變時被評估,因此你不能在約束中使用sysdate,因爲不能保證所有的數據都通過約束。在你的代碼中,如果列名爲「date_of_birth」,什麼是「dateOfBirth」?如果它們是相同的,那麼你的第一個約束就是說出生的雛形必須比它自身始終的18個月大,而且在60個月之後不到60個月,而這始終也是。這種做法都是錯誤的。 –

+0

謝謝大衛阿爾德里奇。它如何構建以實現上述檢查? – user2282435