Таблица не обновляется при срабатывании триггера - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть 2 таблицы:

Сотрудники (Employee_ID, First_name, Last_name, Email, Hire_date, Department_ID)

Отделы (Department_ID, Department_name, Total_employees).

I создали триггер, который срабатывает после вставки сотрудника в таблицу сотрудников. Он увеличивает столбец total_employees на 1 для: нового вставленного Department_ID.

Триггер:

create or replace TRIGGER emp_count_department
AFTER INSERT OR DELETE ON EMPLOYEES
for each row
DECLARE
    counter NUMBER;
BEGIN
    if inserting then
        select total_employees into counter
        from departments
        where department_id = :new.department_id;

        update departments
        set total_employees = counter+1
        where department_id = :new.department_id;

    elsif deleting then
        select total_employees into counter
        from departments
        where department_id = :old.department_id;

        update departments
        set total_employees = counter-1
        where department_id = :old.department_id;
    end if;
END;

Когда я пытаюсь вставить сотрудника, он вставляется, но не увеличивает total_employees на 1 в отделах стол. Когда я пытаюсь вставить сотрудника с идентификатором отдела_, которого нет в таблице отделов, возникает ошибка. Таким образом, триггер работает, но не увеличивает общее число на 1.

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Попробуйте это:

create or replace TRIGGER emp_count_department
AFTER INSERT OR DELETE ON EMPLOYEES
for each row
BEGIN
    if inserting then
        update departments
        set total_employees = total_employees+1
        where department_id = :new.department_id;

    elsif deleting then
        update departments
        set total_employees = total_employees-1
        where department_id = :old.department_id;
    end if;
END;
0 голосов
/ 16 апреля 2020

Я думаю, что вам не хватает важного варианта использования, что если таблица сотрудников обновляется и изменяется dept_id. Чтобы расширить ответ, который дал @pmdba, я думаю, что следующий код будет работать лучше всего.

CREATE OR REPLACE TRIGGER emp_count_dept
AFTER INSERT OR UPDATE OF DEPT_ID OR DELETE ON employees
FOR EACH ROW
BEGIN
  IF :new.dept_id IS NOT NULL THEN
    UPDATE departments d
    SET d.total_employees = NVL(d.total_employees, 0)+1
    WHERE d.department_id = :new.dept_id;
  END IF;

  IF :old.dept_id IS NOT NULL THEN
    UPDATE departments d
    SET d.total_employees = d.total_employees - 1
    WHERE d.department_id = :old.dept_id;
  END IF;
END;
/

Теперь это касается UPDATE операторов. А также заботится о первых INSERT для данного отдела (если вы не инициализировали все кафедры.total_employee до 0 при их создании).

Я также создал этот DBFiddle, демонстрирующий функциональность (и почему вам нужна функция NVL или по умолчанию ваш столбец TOTAL_EMPLOYEES равен 0) ( Link )

0 голосов
/ 16 апреля 2020

Я провел простое тестирование вашего кода в Oracle 11g, и, похоже, он работает. Пожалуйста, проверьте, пропустили ли вы при добавлении информации.

 create table emp1(emp_id number ,dept_id number);

 create table dept1 (dept_id number ,total_emp number);

    CREATE OR replace TRIGGER emp_count_dept
      AFTER INSERT OR DELETE ON emp1
      FOR EACH ROW
    DECLARE
        counter NUMBER;
    BEGIN
        IF inserting THEN
          UPDATE dept1
          SET    total_emp = total_emp + 1
          WHERE  dept_id = :new.dept_id;
        ELSIF deleting THEN
          UPDATE dept1
          SET    total_emp = total_emp - 1
          WHERE  dept_id = :old.dept_id;
        END IF;
    END; 

    insert into dept1 values(10,10);

    insert into emp1 values(10,10);

    select * from dept1;

    DEPT_ID TOTAL_EMP
        10  11
...