2013-04-12 50 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