如何跨数据库表执行业务规则?
How to enforce a business rule across database tables?
我正在 sql 开发人员的这个银行管理系统数据库项目 (oracle) 上工作,我取得了一些进展,但我被这个小问题困住了
问题:我有一个 employee
的 table,其中 employee id
作为主键,其中 table 有一个 position
的属性(职员、经理等)和 branch id
(该员工工作的分支机构),它是一个外键(引用 branch
table 的 branch_id
)。然后有一个branch
的table,主键是branch id
,外键是manager_id
(参考employee
的employee_id
table).
我应该写什么样的查询来确保作为该分支机构经理的员工也必须将术语“经理”作为 his/her 职位。
类似
SELECT * FROM branch
INNER JOIN employee ON branch.manager_id = employee.employee_id
WHERE position LIKE "%Manager%"
最直接的方法是构建触发器。这个在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 Dev Community 帐户)。
大家想一想,如果更新了分支经理的Employee记录会怎样?如果他们不再是 MANAGER 或更改分支?
顺便说一下,我在您的数据模型中添加了一个 table:您需要在 EMPLOYEE 和 BRANCH 之间有一个交集 table 来保存 Branch Manager 记录。否则,您将在 EMPLOYEE.BRANCH_ID -> BRANCH.BRANCH_ID 和 BRANCH.MANAGER_ID -> EMPLOYEE.EMPLOYEE_ID.
之间产生循环依赖
我正在 sql 开发人员的这个银行管理系统数据库项目 (oracle) 上工作,我取得了一些进展,但我被这个小问题困住了
问题:我有一个 employee
的 table,其中 employee id
作为主键,其中 table 有一个 position
的属性(职员、经理等)和 branch id
(该员工工作的分支机构),它是一个外键(引用 branch
table 的 branch_id
)。然后有一个branch
的table,主键是branch id
,外键是manager_id
(参考employee
的employee_id
table).
我应该写什么样的查询来确保作为该分支机构经理的员工也必须将术语“经理”作为 his/her 职位。
类似
SELECT * FROM branch
INNER JOIN employee ON branch.manager_id = employee.employee_id
WHERE position LIKE "%Manager%"
最直接的方法是构建触发器。这个在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 Dev Community 帐户)。
大家想一想,如果更新了分支经理的Employee记录会怎样?如果他们不再是 MANAGER 或更改分支?
顺便说一下,我在您的数据模型中添加了一个 table:您需要在 EMPLOYEE 和 BRANCH 之间有一个交集 table 来保存 Branch Manager 记录。否则,您将在 EMPLOYEE.BRANCH_ID -> BRANCH.BRANCH_ID 和 BRANCH.MANAGER_ID -> EMPLOYEE.EMPLOYEE_ID.
之间产生循环依赖