为什么这个触发器不好?

时间:2018-01-05 19:54:51

标签: sql database oracle oracle11g triggers

问题如下:任何部门最多允许50名员工

我的老师说下面的触发器不是解决方案,但我没有理解,所以他向我们展示了使用行级触发器和包(因为突变)的另一种解决方案。

下面的触发器不按预期方式运行的情况是什么?我真的想不出一个。

谢谢!

CREATE OR REPLACE TRIGGER pb10_trp AFTER
    INSERT OR UPDATE OF department_id ON employees
DECLARE
    nr   NUMBER;
BEGIN
    SELECT
        MAX(COUNT(employee_id) )
    INTO
        nr
    FROM
        employees
    GROUP BY
        department_id;

    IF
        nr > 50
    THEN
        raise_application_error(-20456,'Too many employees!');
    END IF;
END;

1 个答案:

答案 0 :(得分:0)

问题的完整案例如下:    - 表格后面可以添加“每个部门不超过50名员工”

说到这里,提供的解决方案不正确,因为如果某个部门在启用此触发器时拥有超过50名员工,则任何人都无法再对该表执行插入或更新操作。

例如:

  1. 部门1有51名员工,部门2有3名员工。
  2. 用户A在部门2中插入2名员工,因此员工总数将变为5。
  3. 触发器引发错误,即使用户A没有做错任何事。