gpt4 book ai didi

postgresql - 如何避免 PostgreSQL 触发器中的递归

转载 作者:行者123 更新时间:2023-11-29 12:26:44 26 4
gpt4 key购买 nike

我在触发器中遇到递归问题。

我有 table :

CREATE TABLE employees(
task int4 NOT NULL,
first_name varchar(40) NOT NULL,
last_name varchar(40) NOT NULL,
PRIMARY KEY (task, cli_id_number)
);

当我插入值时:

(123, name, last)

我也想自动插入这些值:

(321, name, last)

我按以下方式执行此操作,但显然触发器是递归的,并且在第一次递归后它会尝试插入先前插入的值。

CREATE OR REPLACE FUNCTION insert_task() RETURNS trigger AS $BODY$
BEGIN
IF new.task = '123' AND (
SELECT cant FROM (
SELECT name, task, count(*) AS cant
FROM client_task
WHERE name = NEW.name AND task = NEW.task
GOUP BY 1,2
HAVING count(*) <= 1
) t) = 1 THEN
INSERT INTO client_task(task, name, last_name)
VALUES('321', NEW.task, NEW.name, NEW.last_name);
RETURN NEW;
ELSE
IF NEW.task = '321' AND (
SELECT cant FROM (
SELECT name, task, count(*) AS cant
FROM client_task
WHERE name = NEW.name AND task = NEW.task
GROUP BY 1, 2
HAVING count(*) <=1
) t) = 1 THEN
INSERT INTO client_task(task, name, last_name)
VALUES('123', NEW.task, NEW.name, NEW.last_name);
RETURN NEW;
END IF;
END IF;
RETURN NULL;
END; $BODY$ LANGUAGE 'plpgsql';

感谢任何帮助。

最佳答案

使用函数pg_trigger_depth()。根据the documentation它返回:

current nesting level of PostgreSQL triggers (0 if not called,directly or indirectly, from inside a trigger)

CREATE TRIGGER insert_task
AFTER INSERT ON employees
FOR EACH ROW
WHEN (pg_trigger_depth() = 0)
EXECUTE PROCEDURE insert_task()

关于postgresql - 如何避免 PostgreSQL 触发器中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31765582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com