下面是我正在使用的代码,每次我尝试更新我得到的薪水
“错误:在关系“员工”的规则中检测到无限递归
SQL状态:42P17”
使用的对象
create table rowan.employees (emp_id serial primary key, name varchar(100), salary numeric);
插入值
insert into rowan.employees (name, salary) values
('John Doe', 50000),
('Jane Doe', 60000),
('Rafael Orta',80000);
创建规则
create or replace rule update_salary
as on update to rowan.employees
where new.salary > 70000
and pg_trigger_depth() = 0
do instead
update rowan.employees
set salary = 70000
where emp_id = new.emp_id;
执行更新
update rowan.employees set salary = 80000 where emp_id = 3;
检查数值
select * from rowan.employees;
我正在尝试执行下面的命令
update rowan.employees set salary = 80000 where emp_id = 3;
我期待它能将薪水更新为70000。任何帮助将不胜感激。
您可能想为此使用触发器,如下所示(未经测试):
CREATE FUNCTION cap_salary() RETURNS trigger
AS $$
BEGIN
IF NEW.salary > 70000
THEN
NEW.salary = 70000;
FI;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER cap_salary_on_update
BEFORE UPDATE ON rowan.employees
FOR EACH ROW
EXECUTE FUNCTION cap_salary();
调用规则系统是一个问题,因为它在执行任何操作之前首先重写查询。
WHERE
条件将是重写查询的一部分 - 但它仍然包含 UPDATE
上的 rowan.employees
,即规则被再次执行 - 一次又一次。请注意,WHERE
将合并到重写的查询中,并且在重写查询之前不会进行检查(这包括所有 UPDATE
查询都将被重写,无论条件是否满足)。