使用从同一个表中获取值的变量创建更新触发器的正确​​方法是啥?

Posted

技术标签:

【中文标题】使用从同一个表中获取值的变量创建更新触发器的正确​​方法是啥?【英文标题】:What is the proper way to create an update trigger with a variable getting value from the same table?使用从同一个表中获取值的变量创建更新触发器的正确​​方法是什么? 【发布时间】:2017-11-16 21:30:30 【问题描述】:

我正在创建一个更新触发器,其中员工的薪水永远不会高于总裁的薪水。但是我需要子查询总裁的薪水以进行比较和“新”更新员工的薪水。

我最初使用 from employees 表中的子查询,但由于 mutating table 问题而不得不创建一个新表。我不认为创建新表是真正实现的可行解决方案。

有什么方法可以在不创建新表的情况下节省总裁的薪水?

CREATE OR REPLACE TRIGGER prevent_salary 
BEFORE UPDATE ON employees
FOR EACH ROW 
    declare pres_sal number(8,2);
BEGIN 
    select salary into pres_sal from employees_salary where job_id='AD_PRES';--employees_salary was employees but that gives mutating error

    IF (:new.salary > pres_sal)
        THEN UPDATE employees 
        SET salary = :old.salary
        WHERE employee_id = :old.employee_id;
    END IF;
END;

【问题讨论】:

【参考方案1】:

一种方法是在BEFORE STATEMENT 触发器中保存总裁的薪水,然后在FOR EACH ROW 触发器中使用它。

“复合触发器”至少从 11.1 版开始就已经存在,它提供了一种在一个地方完成所有操作的好方法。

这是一个例子:

CREATE OR REPLACE TRIGGER prevent_salary 
FOR UPDATE OF salary ON employees
COMPOUND TRIGGER

  pres_sal NUMBER;

BEFORE STATEMENT IS
BEGIN
    select salary 
    into pres_sal 
    from employees 
    where job_id='AD_PRES';
END BEFORE STATEMENT;

BEFORE EACH ROW IS 
BEGIN 
    :new.salary := least(:new.salary, pres_sal);
END BEFORE EACH ROW;

END prevent_salary;

【讨论】:

【参考方案2】:

你可以试试这个:

CREATE OR REPLACE TRIGGER prevent_salary 
BEFORE UPDATE ON employees
FOR EACH ROW 
    declare pres_sal number(8,2);
BEGIN 
    select salary into pres_sal from employees_salary where job_id='AD_PRES';--employees_salary was employees but that gives mutating error

    IF (:new.salary > pres_sal)
     Raise_Application_Error (-20101, 'An employee''s salary couldn''t exceed president''s !');
    END IF;
END;

【讨论】:

以上是关于使用从同一个表中获取值的变量创建更新触发器的正确​​方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Golang:如何使用创建触发器从表中获取 LastInsertId?

如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)

创建触发器以将数据从一个表获取到另一个表并生成时间戳

如何编写从布尔表达式查询中获取单个值的函数/触发器

触发仅将变量的 1 个字符插入表中

另一个 04079:无效的触发器规范