【问题标题】:How to enforce a business rule across database tables?如何跨数据库表强制执行业务规则?
【发布时间】:2018-05-19 16:00:25
【问题描述】:

我正在 sql developer 上处理这个银行管理系统数据库项目(oracle),我已经取得了一些进展,但我被这个小问题困住了

问题:我有一个employee 的表,其中employee id 作为主键,在该表中有一个属性position(职员、经理等)和branch id(该分支所在的分支)员工工作)这是一个外键(引用branch表的branch_id)。然后有一个branch的表,主键为branch id,外键为manager_id(参考employee表的employee_id)。

我应该写什么样的查询来确保作为该分支机构经理的员工也必须有“经理”一词作为他/她的职位。

【问题讨论】:

  • 你能分享你用来构建表和约束的 DDL 吗?另外,您希望查询实际显示什么?听起来你们中的更多人需要对分支表进行约束,即经理必须是位置 = 'MANAGER' 的员工
  • 创建规则以确保条件
  • @AswaniMadhavan - 基本上这是对 OP 问题的总结,而不是有用的建议。

标签: sql database oracle business-rules


【解决方案1】:

最直接的方法是构建触发器。这个在 EMPLOYEE 中查找 MANAGER_ID 以验证他们的职位(我还添加了一条规则,即经理必须是他们管理的分支机构的员工,也许你不需要这个)。

create trigger branch_manager_trg 
     before insert or update on branch_manager   
     for each row
declare
    dummy employee.employee_id%type;
begin
    select e.employee_id
    into dummy
    from employee e
    where e.employee_id = :new.manager_id
    and e.branch_id = :new.branch_id
    and e.emp_type = 'MANAGER';
exception
  when no_data_found then
       raise_application_error(-20000, 'Branch manager must be a MANAGER');
end;
/

这里是a LiveSQL demo(需要免费的 Oracle 开发社区帐户)。

您要考虑的一件事是,如果更新了分公司经理的员工记录会发生什么?如果他们不再是 MANAGER 或更改分支?


顺便说一下,我在您的数据模型中添加了一个表:您需要一个 EMPLOYEE 和 BRANCH 之间的交集表来保存 Branch Manager 记录。否则,您将在 EMPLOYEE.BRANCH_ID -> BRANCH.BRANCH_ID 和 BRANCH.MANAGER_ID -> EMPLOYEE.EMPLOYEE_ID 之间产生循环依赖。

【讨论】:

    【解决方案2】:

    类似

    SELECT * FROM branch 
    INNER JOIN employee ON branch.manager_id = employee.employee_id 
    WHERE position LIKE "%Manager%"
    

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 2014-07-05
      相关资源
      最近更新 更多