【发布时间】:2020-09-10 11:06:09
【问题描述】:
我正在做一个关于 Oracle SQL 的大学项目,当我尝试更新表时,我不断收到错误“表 (...) 正在变异,触发器/函数可能看不到它”。我的 participateTeams 表有 3 列 (eventName varchar()、teamId 编号、teamPlace 编号)。
这里的目标是,当我在活动中更新给定团队的 teamPlace 时,该位置必须小于或等于同一活动中参与团队的数量。
我的触发器如下:
Before update on participateTeams
for each row
Declare participants number;
Begin
select count(*) into participants from participateteams where :New.eventName = participateteams.eventName;
if(:NEW.teamplace>participants) then
RAISE_APPLICATION_ERROR(-20250,'O lugar da equipa é inválido');
end if;
End;
/
根据我的研究,这是因为我正在尝试读取调用触发器的同一张表。 我也尝试将代码的 select 部分导出到函数中,但问题仍然存在。
活动的参与者是团队本身,而不是组成这些团队的个人。示例:如果 A 队、B 队和 C 队参加了一个活动 E,那么同一活动 E 的计数应该是 3。
有什么建议吗?谢谢。
【问题讨论】:
-
一种方法可能是使用语句级触发器来检查整个表。这不会扩展到非常大的数量,但它可能适用于大学项目。一个改进可能是让行级触发器将更新的团队 ID 存储在包数组变量中,然后让语句级触发器只检查这些。或者,有一个解决方案使用带有约束的提交时刷新物化视图。
标签: sql oracle plsql mutating-table