我有三张桌子
- 账单
- 记录
- 房子
在录制中,我有一个名为 DateRecored 的列。在 bill 中,我有一个名为 duedate 的列,而在 House 中,我有一个名为 Operational 的列。
我需要做一个限制,以便当账单逾期 60 天时,Operational 列将变为停用。
如果您需要信息,请告诉我,但我觉得这就是您所需要的。
我有三张桌子
在录制中,我有一个名为 DateRecored 的列。在 bill 中,我有一个名为 duedate 的列,而在 House 中,我有一个名为 Operational 的列。
我需要做一个限制,以便当账单逾期 60 天时,Operational 列将变为停用。
如果您需要信息,请告诉我,但我觉得这就是您所需要的。
约束仅在您插入/更新/删除记录时生效。在您的情况下,Bill 表中给定记录的年龄应该触发不同表中的更改,并且您需要定期作业来执行此操作。如果没有任何用户触发的 DML 操作,DBMS 不会促进这种自动更新(通过触发器或约束)。
如前所述,您正在寻找的是触发器,而不是约束。在 Oracle 中使用 DBMS_SCHEDULER,触发器将如下所示:
BEGIN
DBMS_SCHEDULER.create_job (
job_name => 'update_operational_after',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN UPDATE house set operational=false where id in (select house.id from House join Bill on (bill.house_id=house.id) where duedate > sydate+60; END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'freq=daily; byminute=0;byhour=0;byminute=0;bysecond=0',
end_date => NULL,
enabled => TRUE,
comments => 'Updates all operational to false if they've passed the due date');
END;
/
这会将给定的更新安排在每天午夜执行。