如何在一个表中创建SQL约束会影响另一个表

时间:2012-10-21 08:21:29

标签: sql oracle triggers constraints

我有三张桌子

  • 比尔
  • 录制

在录制中,我有一个名为DateRecored的列。在bill中,我有一个名为duedate的列,在House中,我有一个名为Operational的列。

我需要制定约束,以便当账单逾期60天时,“操作”列将更改为停用。

如果您需要信息,请告诉我,但我觉得这就是您需要的全部内容。

2 个答案:

答案 0 :(得分:1)

约束仅在插入/更新/删除记录时生效。在您的情况下,Bill表中给定记录的年龄应触发另一个表中的更改,并且您需要定期作业来执行此操作。 DBMS不会在没有任何用户触发的DML操作的情况下促进这种自动更新(通过触发器或约束)。

答案 1 :(得分:0)

如前所述,您正在寻找的是触发器,而不是约束。在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;
/

这会安排每天午夜执行给定的更新。