【问题标题】:Creating trigger for date of Birth为出生日期创建触发器
【发布时间】:2013-04-05 06:36:33
【问题描述】:

请有人告诉我如何为上限为 60 和下限为 20 的出生日期创建触发器。我正在执行一项任务,该任务需要限制甲骨文 11g 上的航运公司的员工年龄范围。谢谢你

【问题讨论】:

  • 很高兴看到您尝试了什么以及遇到了什么问题,但现在是星期五(感谢 Crunchy),我感觉很慷慨,所以 this answer 应该给你一个很好的起点。
  • 您不能对年龄上限实施有意义的约束作为出生日期的触发器,因为年龄在没有数据变化的情况下发生变化。因此,人们到了 60 岁,而没有提出无效。换句话说,这里教的是语法(您可以从手册中获得),而不是任何类型的软件开发方法。

标签: oracle oracle11g date-arithmetic data-integrity


【解决方案1】:

不要使用触发器来强制关系完整性,使用约束。这就是他们的目的。

您没有费心为我们提供表格结构,因此您需要针对您的实际表格进行调整。

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 列,您就会遇到大问题。

【讨论】:

  • 很好的解决方案。 不要使用触发器总是要走的路!
  • @APC 由于员工可能在公司工作了多个时期,因此可以说雇用日期无论如何都应该在不同的表格中。
【解决方案2】:

谢谢。我终于用了这个

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 行的错误: ORA-02436: 在 CHECK 约束中错误地指定了日期或系统变量

sysdate 不是months_between 的有效可用比较吗?

【讨论】:

  • 您不能在检查约束中使用 sysdate。正如我对您的问题所评论的那样,仅在数据更改时才评估检查约束,因此您不能在约束中使用 sysdate ,因为不能保证所有数据都通过约束。在您的代码中,如果列名为“date_of_birth”,那么“dateOfBirth”是什么?如果它们相同,那么您的第一个限制是说出生的 dae 必须比其本身早 18 个月,它总是如此,并且在它之后的 60 个月之前小于 60 个月,它也总是如此。这种做法全错了。
  • 谢谢大卫·奥尔德里奇。如何构建以实现上述检查?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多