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)