触发必须相互更新的两个表的替代方案 [英] Trigger alternatives for two tables that have to mutually update each other

查看:97
本文介绍了触发必须相互更新的两个表的替代方案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

(很长的帖子,很抱歉,但是我想所有信息都确实有必要)

(Sorry for the long post, but I guess all the information is really necessary)

我们有两个表-任务和子任务.每个任务由一个或多个子任务组成,并且每个对象都有开始日期,结束日期和持续时间.此外,子任务具有顺序.

We have two tables - task and subtask. Each task consists of one or more subtasks, and each of these objects has a start date, end date and duration. Additionally, subtasks have a ordering.

表格

create table task (
  pk number not null primary key, 
  name varchar2(30) not null,
  start_date date,
  duration_in_days number,
  end_date date,
  needs_recomputation number default 0
);

create table subtask (
  pk number not null primary key, 
  task_fk references task(pk),
  name varchar2(30) not null,
  start_date date,
  duration_in_days number,
  end_date date,
  ordering number not null
);

业务规则

  • 第一个子任务与任务的开始日期相同
  • 对于每个后续子任务,其开始日期等于其前任的结束日期
  • 最后一个子任务的结束日期与任务相同
  • 对于每个子任务和任务:开始日期+持续时间=结束日期
  • 任务: duration = sum(子任务的持续时间)
  • 任务的结束日期和持续时间无法直接更改(感谢上帝!)

这直接为更新/删除生成以下要求:

This directly generates the following requirements for updates/deletes:

  • 更改任务的开始日期时,将其第一个子任务的开始日期设置为相同的值,并重新计算所有子任务的开始日期和结束日期
  • 更改子任务的开始日期,结束日期或持续时间时,其其他字段也会相应地更新,随后的所有子任务也会相应地更新,最后,任务也会相应地更新
  • 删除子任务后,所有后续子任务都会相应更新,最后,任务也会相应更新

当前方法

  • 任务表中有一个触发器,可以在开始日期更改时更新第一个子任务并设置needs_recomputation标志
  • 子任务表具有一个触发器,该触发器可以使开始日期/结束日期/持续时间保持一致,并为父任务设置Needs_recomputation标志(由于变异表问题,我们无法在此处直接更新后续任务)
  • 为避免触发级联,每个触发器都设置一个包变量,以指示不应触发其他触发器
  • dbms_scheduler作业定期检查任务表,并重新计算设置了Needs_recomputation标志的任务的数据

(某种)可行,但有一些缺点:

This (kind of) works, but it has several drawbacks:

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆