我正在尝试创建一个表来记录对另一个表的估计小时数所做的更改。数据库作为一个整体是一个项目管理系统,供公司为其员工分配工作并为客户创建发票。

目前我有:

CREATE TABLE task_history
(
    task_history_id         NUMBER(5),
    previous_est_hours      NUMBER(3,1),
    change_date         DATE,
    reason_for_change       VARCHAR2(50),
    task_id             NUMBER(5),

CONSTRAINT TASKHIST_TASKHISTID_PK   PRIMARY KEY (task_history_id),
CONSTRAINT TASKHIST_TASKID_FK       FOREIGN KEY (task_id) REFERENCES task(task_id),
CONSTRAINT TASKHIST_TASKID_NN CHECK (task_id IS NOT NULL),
CONSTRAINT TASKHIST_CHANGEDATE_NONFUTURE CHECK (change_date <= sysdate)
);

change_date 不能是将来的日期,它必须是今天或过去。
最后一个检查约束是问题。据我了解,由于我忘记的原因,您不能使用 sysdate,但您不能。我还尝试了 GETDATE() 和我在网上找到的所有其他变体。
我怎样才能完成这个可能很简单的任务?

最佳答案

您不能从检查约束调用函数,因此最自然的方法是在 task_history 表上定义触发器,即

CREATE OR REPLACE TRIGGER task_change_date_in_past
  BEFORE INSERT OR UPDATE ON task_history
  FOR EACH ROW
BEGIN
  IF( :new.change_date > sysdate )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 'Change date must be in the past' );
  END IF;
END;

关于sql - 检查约束以确保日期不在 future ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4739298/

10-11 05:03