sql - 如何跨数据库表强制执行业务规则?
问题描述
我正在 sql developer 上处理这个银行管理系统数据库项目(oracle),我已经取得了一些进展,但我被困在这个小问题上
问题:我有一个作为主键的表,employee
并且employee id
在该表中有一个属性position
(职员,经理等),以及branch id
(该员工工作的分支)是一个外键(引用branch_id
表branch
)。然后有一个作为主键和branch
作为外键的表(参考表)。branch id
manager_id
employee_id
employee
我应该写什么样的查询以确保作为该分支机构经理的员工也必须将“经理”一词作为他/她的职位。
解决方案
最直接的方法是构建触发器。这个在 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;
/
这是一个 LiveSQL 演示(需要免费的 Oracle 开发社区帐户)。
您要考虑的一件事是,如果更新了分公司经理的 Employee 记录会发生什么?如果他们不再是 MANAGER 或更改分支?
顺便说一句,我在您的数据模型中添加了一个表:您需要一个 EMPLOYEE 和 BRANCH 之间的交集表来保存 Branch Manager 记录。否则,您将在 EMPLOYEE.BRANCH_ID -> BRANCH.BRANCH_ID 和 BRANCH.MANAGER_ID -> EMPLOYEE.EMPLOYEE_ID 之间产生循环依赖。
推荐阅读
- javascript - 为什么在 CombinedVueInstance 上不存在 this.renderChart?
- r - 润滑; Dplyr 如何按周和类别聚合数据框
- javascript - 函数和参数传递
- python-3.x - 不明白为什么我的 python 不起作用
- python - 我怎样才能让我的敌人射弹攻击玩家移动的地方?
- ios - Jitsi 在 IOS 中遇到视频和静音
- swift - 根据字符匹配百分比对搜索结果进行排序
- java - 为什么 Collectors.counting 会减少为 long?
- azure-devops - 在多个其他管道全部完成后触发 Azure 管道构建
- python - 随机选择数组中的元素 - 满足条件