如何获取而不是触发被触发

How to get instead of trigger to be triggered

我试图在 table 更新(并且视图由触发器更新)时让这个而不是触发器工作。

CREATE OR REPLACE TRIGGER increase_boss_sub_salary
INSTEAD of UPDATE ON emp_sub_view
    FOR EACH ROW BEGIN
        UPDATE employees
        SET salary = salary * 1.05 
        WHERE employee_id = :old.employee_id;
END;

emp_sub_view是employee_subordinates的一个观点。

employee_subordinates 由这个有效的触发器触发。

CREATE OR REPLACE TRIGGER keep_sub_count
AFTER DELETE OR INSERT OR UPDATE ON EMPLOYEES

    FOR EACH ROW BEGIN 
        IF DELETING OR UPDATING
            THEN
            UPDATE employee_subordinates
            SET subcount = subcount - 1
            WHERE employee_id = :old.manager_id; 
        END IF;

        IF INSERTING OR UPDATING
            THEN
            UPDATE employee_subordinates
            set subcount = subcount + 1
            WHERE employee_id = :new.manager_id;
        END IF;

END;

假设我将一名员工更新为新经理。这会触发 keep_sub_count 触发器,然后更新 employee_subordinates 及其视图 emp_sub_view。发生这种情况时,我的触发器 increase_boss_sub_salary 不会因为 emp_sub_view 发生变化而被触发吗?我似乎无法解雇它。

您的 increase_boss_sub_salary 触发器将在您更新视图时触发。 这并不意味着它会在更新基础数据时触发。这意味着它在视图上执行更新 SQL 语句时触发。

例如

update emp_sub_view
set salary=salary * 1.05
where employee_id=44;

使用 instead of 触发器,您可以更新视图中显示的数据并将更新重定向到基础表。

您的触发器将是:

CREATE OR REPLACE TRIGGER increase_boss_sub_salary
INSTEAD of UPDATE ON emp_sub_view
    FOR EACH ROW BEGIN
        UPDATE employees
        SET salary = :new.salary
        WHERE employee_id = :old.employee_id;
END;