oracle - Oracle:行级触发器将行插入表并更新另一个表的列
问题描述
我有三个具有以下列的表:
- 员工:Employee_ID,total_project_budget
- 项目:Project_ID、预算
- 工作:Employee_ID,Project_ID
当将行插入 WorkingOn 表时,我正在尝试在 Oracle 中创建行级触发器。它将获取项目预算的总和并更新到员工正在处理的员工的 total_project_budget 中。
我当前的行级触发器:
CREATE OR REPLACE TRIGGER testtrigger
AFTER INSERT ON WorkingOn
FOR EACH ROW
BEGIN
UPDATE employee
SET TOTAL_BUDGET = ( SELECT SUM(budget)
FROM project INNER JOIN workingon
ON project.project_id = workson.project_id
WHERE workingon.employee_id = employee.employee_id )
WHERE employee_id = :NEW.employee_id;
END;
/
如果我运行这个触发器,我会得到变异表,
ORA-04091: 表 user.WORKINGON 正在变异,触发器/函数可能看不到它
但是,如果我使用 AUTONOMOUS_TRANSACTION 运行,
ORA-06519: 检测到活动的自主事务并回滚
编辑:
澄清一下,WorkingOn: Employee_ID 引用 Employee.employee_ID,Project_ID 引用 Project.project_ID。
员工 -(1 到 1)-> WorkingOn -(1 到 *)-> 项目
解决方案
我建议仅在项目表上使用 sum 如下:
CREATE OR REPLACE TRIGGER testtrigger
AFTER INSERT ON WorkingOn
FOR EACH ROW
BEGIN
UPDATE employee
SET TOTAL_BUDGET = ( SELECT SUM(budget)
FROM project
WHERE project.project_id = :NEW.project_id)
WHERE employee_id = :NEW.employee_id;
END;
/
干杯!!
推荐阅读
- c++ - Qt 的事件循环线程是安全的还是原子的?处理 `QueuedConnection` 时如何同步?
- regex - 允许除 %\/# 之外的 PosixPrint 字符?: 并且字符串开头和结尾的空格除外
- bash - 如何拆分包含打印机 IP 地址和文本的文本文件以发送到该打印机
- iis - 当 .NET Core 托管包的版本落后于开发机器版本时会发生什么
- python-3.x - QgsDistanceArea computeSpheroidProject 返回 0, 0
- google-cloud-functions - 错误:WebhookClient.handleRequest 处没有请求意图的处理程序
- angular - 结合两个 RxJS Observables/Subscriptions 并遍历它们的数据
- python - lxml 包含相对路径
- laravel - 如何检查我使用的是哪个版本的 laravel-query-builder?
- ios - iOS - 如何修复表格视图单元格中的此动画向左然后再次返回