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

时间:2017-11-21 01:45:25

标签: oracle plsql database-trigger

我试图在更新表时(而且触发器更新视图)尝试使用此触发器而不是触发器。

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。因为emp_sub_view发生了变化,所以当我发生这种情况时,我的触发器是否会触发increase_boss_sub_salary吗?我似乎无法解雇它。

1 个答案:

答案 0 :(得分:1)

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

例如。

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

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

您的触发器将是:

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;