如何制定允许用户从今天起只输入 DateTime 的 CHECK 约束?

Posted

技术标签:

【中文标题】如何制定允许用户从今天起只输入 DateTime 的 CHECK 约束?【英文标题】:How to make a CHECK constraint that allow user to only input DateTime from today and onwards? 【发布时间】:2019-04-28 13:33:23 【问题描述】:

与标题一样,我正在尝试解决我的 CHECK 限制,即用户只能从今天起输入日期和时间

这是我现在使用的SQL开发者版本(我查询了版本): - Oracle Database 12c 企业版 12.2.0.1.0 版 - 64 位生产 - PL/SQL 版本 12.2.0.1.0 - 生产

我尝试过的:

ALTER TABLE job_assignment
    ADD CONSTRAINT chk_start_date CHECK ( start_date >=
    SYSDATE()
);

但这给了我一个错误,ORA-00907:缺少右括号。

我也遇到过这个, 检查约束条件不能包含以下结构: - 子查询和标量子查询表达式 - 调用不确定的函数(CURRENT_DATE, CURRENT_TIMESTAMP、DBTIMEZONE、 本地时间戳,会话时区, SYSDATE、SYSTIMESTAMP、UID、USER 和 USERENV)

需要帮助。

【问题讨论】:

每次更新都会触发检查约束。即使这可行,这也意味着只要 start_date 出现,您的行就会被锁定,除了删除之外的所有内容。这就是你想要的吗? 是的,我的 start_date 在被输入到表后(假设它通过了 CHECK 约束)将不会被更改(永远)。它只需要在输入时检查用户是否输入了从今天或以后的日期和时间。行不会更改,因为此表会保留以供记录。 【参考方案1】:

这将是一个触发器,例如

create or replace trigger trg_biu_jobas
  before insert or update on job_assignment
  for each row
begin
  if :new.start_date < sysdate then
     raise_application_error(-20001, 'Start date must be after "now"');
  end if;
end;

【讨论】:

【参考方案2】:

您可能必须在此处使用触发器:

CREATE TRIGGER chk_date_today
BEFORE INSERT ON job_assignment
FOR EACH ROW
BEGIN
    IF (:NEW.start_date < SYSDATE()) THEN
        raise_application_error(-20001, 'start_date must be after now');
   END IF;
END;

【讨论】:

以上是关于如何制定允许用户从今天起只输入 DateTime 的 CHECK 约束?的主要内容,如果未能解决你的问题,请参考以下文章

需要使用 MVC 中的表单验证从服务器端验证 DateTime

数据库界面修改时,出现不允许从数据类型 datetime 到 int 的隐式转换.请使用 CONVERT 函数来运行此查询。

如何从我的应用程序下载 300k 日志行?

JavaScript --- 如何制定规则以确保用户输入的值介于两个特定数字之间

如何使用 Flutter 和 Firebase 为聊天应用制定规则

如何从现有的 Time.zone 为 Rails 创建 Ruby DateTime?