在触发前变异表

nie*_*els 1 oracle triggers

我试图Products在某些情况下使用触发器来避免删除表中的行.代码如下

CREATE TRIGGER trgPreventProductRemoval
    BEFORE DELETE ON Products
    FOR EACH ROW

    BEGIN
        DECLARE
            l_custid INTEGER;
        BEGIN
            SELECT count(*) INTO l_custid FROM Orders WHERE product = :old.prodDescription ;

            IF l_custid > 0 THEN
                raise_application_error (-20100, 'You can not delete a product that has active orders!');
            END IF;
        END;
    END;
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误:table ORDERS is mutating, trigger/function may not see it.

我该如何解决?

EDIT-SOLUTION:我接受了下面的解决方案,因为它是"政治上正确的".由于一些"限制",我无法使用它,最后找到了不同的解决方法.查看我单独发布的解决方案.

Sha*_*nce 5

在Orders和Product表之间使用外键而不是触发器.

  • 不允许?这看起来有点荒谬.外键的全部目的是*准确地解决您所面临的问题.我知道你是这里的"受害者",是一个非常非常糟糕的政策.但是,考虑到你肯定遇到的竞争条件和锁定问题,你实际上可能会更好地打击能够使用外键的政治斗争,而不是试图围绕它进行编码. (4认同)