使用视图更新表并获取“在关系“员工”的规则中检测到无限递归

问题描述 投票:0回答:1

下面是我在 PostgreSQL 16 数据库中使用的代码。每次我尝试更新我得到的薪水:

错误:在关系“员工”的规则中检测到无限递归
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呢

postgresql recursion triggers rules infinite
1个回答
1
投票

您可能想为此使用触发器,如下所示(未经测试):

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
查询都将被重写,无论条件是否满足)。

© www.soinside.com 2019 - 2024. All rights reserved.