gpt4 book ai didi

SQL/Oracle 10g - 触发器问题

转载 作者:行者123 更新时间:2023-12-04 05:53:34 25 4
gpt4 key购买 nike

在创建语句级触发器时,我遇到了 SQL/Oracle 10g 的问题。我试图用这个触发器实现的目的是在学生人数 < 5 时删除一个实用类(class)。 以下是我所写的:

CREATE OR REPLACE TRIGGER delete_prac
AFTER UPDATE ON studEnrol
BEGIN
DELETE FROM pracList
WHERE Practical IN (
SELECT Practical
FROM studEnrol
GROUP BY Practical
HAVING COUNT(Practical) < 5);
END delete_prac;

然而,我得到的错误是:
ORA-04091: pracList table is mutating, trigger/function may not see it

我研究了这个错误,提出的建议是包含 :new 和 :old 关键字,但我不知道我会怎么做。

任何帮助表示赞赏!

谢谢。

编辑:忘记添加哪个表正在发生变化,它是 pracList 表
EDIT2:将其更改为语句级触发器,并且变异表仍然与 pracList 一起发生

最佳答案

这可能如 Florin Ghita 所建议的那样发生,因为您在 praclist 上有一个触发器。 .更新时 studenrol然后尝试从 praclist 中删除.此行为会触发另一个触发器,从而导致您的问题。引发此错误是为了提供数据的读取一致 View 。如 Tom Kyte says此错误可能表明您的架构或逻辑存在缺陷,您应该重新考虑其中之一或两者。

此外,一般来说,在触发器中执行的全表扫描是 A Bad Idea TM。根据表的大小,您可能最终会在 studlist 上的每次更新上花费 1 秒或 2 小时。 ,远非最优。

不知道您的架构或 praclist 上的触发器是什么很难确定,但是,在您的情况下,似乎有一个“出局”。完全放弃这个触发器;没有必要。

创建一个 materialized viewpraclist为您提供所需的数据。无论如何,不​​断地删除和插入值是没有意义的 praclist当您可以拥有一个 View ,使此处的信息始终保持最新状态时。以下查询应该这样做:

select p.*
from praclist p
join ( select practical
from studenrol
group by practical
having count(*) >= 5 ) s
on p.practical = s.practical

顺便说一句,您当前的触发器不允许插入 praclist如果注册的学生人数突然变得足以进行实践。物化 View 处理这个问题以及变异表错误。

关于SQL/Oracle 10g - 触发器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9783954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com