如何跨数据库表强制执行业务规则?

时间:2018-05-19 16:00:26

标签: sql database oracle business-rules

我正在sql开发人员的这个BANK MANAGEMENT SYSTEM数据库项目(oracle)上工作,我已经取得了一些进展,但我仍然坚持这个小问题

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

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

2 个答案:

答案 0 :(得分:1)

这样的东西
SELECT * FROM branch 
INNER JOIN employee ON branch.manager_id = employee.employee_id 
WHERE position LIKE "%Manager%"

答案 1 :(得分:1)

最直接的方法是构建一个触发器。这个查找员工中的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 Dev社区帐户)。

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

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