Sql 检查约束以确保日期不在将来?

Sql 检查约束以确保日期不在将来?,sql,oracle,plsql,Sql,Oracle,Plsql,我正在尝试创建一个表,记录对另一个表的估计小时数所做的更改。数据库作为一个整体是一个项目管理系统,用于公司向员工分配工作并为客户创建发票 目前我有: CREATE TABLE task_history ( task_history_id NUMBER(5), previous_est_hours NUMBER(3,1), change_date DATE, reason_for_change VARCHAR2(

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

目前我有:

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)
);
创建表任务\u历史记录
(
任务\历史\ id号(5),
以前的预计小时数(3,1),
更改日期,
变更原因VARCHAR2(50),
任务识别号(5),
约束TASKHIST\u TASKHISTID\u PK主键(task\u history\u id),
约束TASKHIST_TASKID_FK外键(task_id)引用task(task_id),
约束任务历史任务id检查(任务id不为空),

CONSTRAINT TASKHIST\u CHANGEDATE\u非UTure CHECK(更改日期我认为您可以定义一个用户定义的函数,该函数执行检查并在检查约束中使用它。

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

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;

CONSTRAINT TASKHIST\u CHANGEDATE\u非未来检查(change\u date在11g中,可以对sysdate使用检查约束:

在11g之前,你应该使用贾斯汀的方法

问候,

Rob。

GETDATE()
是特定于TSQL的。
SYSDATE
是特定于PLSQL的获取当前日期和时间的方法,而
current\u TIMESTAMP
是ANSI替代方法(大多数数据库都支持)。你真的遇到错误了吗?因为这是我第一次听说不使用SYSDATE,所以我想了解更多。你的Oracle版本也会有所帮助。据我所知,你不能通过检查调用用户定义的函数constraint@Andomar-哦,是的,你说得对。我做了更正。
CONSTRAINT TASKHIST_CHANGEDATE_NONFUTURE CHECK (change_date <= sysdate)