【问题标题】:stop future dates constraint oracle停止未来日期约束oracle
【发布时间】:2015-12-17 17:49:10
【问题描述】:

我有一个客户表,我不想添加以下约束

ALTER TABLE Customer ADD CONSTRAINT dateOfBirth CHECK(dateOfBirth <= sysdate);

我收到以下错误消息

SQL 错误:ORA-02436:在 CHECK 约束中错误指定了日期或系统变量

任何帮助将不胜感激。

【问题讨论】:

  • Oracle 不允许在 check 约束中使用 volatile 函数。我认为你必须使用触发器。
  • 正如@GordonLinoff 提到的,这个活动是不允许的。这是概述规则的文档:docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13590.html;具体来说:“如果应用于相同的值,搜索条件必须始终返回相同的值。因此,它不能包含以下任何内容:动态参数 (?);日期/时间函数(CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP);子查询;用户函数(如 USER、SESSION_USER、CURRENT_USER)"

标签: sql oracle


【解决方案1】:

正如@GordonLinoff 所说,您不能使用具有非确定性函数的约束。您可以创建触发器

CREATE TRIGGER trg_no_future_births
  BEFORE INSERT ON customer
  FOR EACH ROW
BEGIN
  IF( :new.dateOfBirth > sysdate )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 'Date of birth cannot be in the future.' );
  END IF;
END;

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多