从函数更新时检测到无限递归(psycopg2,python 2.7,postgres 9.3)

Infinite recursion detected when updating from function (psycopg2, python 2.7, postgres 9.3)

我有一个简单的table:

CREATE TABLE IF NOT EXISTS someTable (
    row_id                 smallserial PRIMARY KEY,
    name                   text NOT NULL,
    creation_date          timestamp with time zone DEFAULT current_timestamp,
    last_updated_date      timestamp with time zone DEFAULT current_timestamp,
    created_by             text DEFAULT "current_user"(),
    last_updated_by        text DEFAULT "current_user"()
);

使用以下规则:

CREATE OR REPLACE RULE log_update_some_table AS
    ON UPDATE TO someTable
    DO ALSO 
        UPDATE someTable 
            SET last_updated_date = current_timestamp, 
                last_updated_by = current_user;

和 plpgsql 中的一个非常简单的函数:

CREATE OR REPLACE FUNCTION test_update ()
RETURNS void AS $$
BEGIN
    UPDATE someTable
    SET name = 'test'
    WHERE row_id = 1;
END;
$$ LANGUAGE plpgsql;

有人会认为该函数 运行 很好,但我收到以下错误:

psycopg2.ProgrammingError: infinite recursion detected in rules for relation "sometable"
CONTEXT:  SQL statement "UPDATE someTable
    SET name = 'test'
    WHERE row_id = 1"
PL/pgSQL function test_update() line 3 at SQL statement

为什么这不起作用,我该如何解决?谢谢!

所以您在 someTable 上的更新规则会触发 someTable 上的更新,该更新执行规则更新 someTable 执行规则...

我会使用一个简单的触发器,像这样:

create or replace function log_update_some_table() returns trigger as $$
begin
    NEW.last_updated_date = current_timestamp;
    NEW.last_updated_by   = current_user;
    return NEW;
end;
$$ language plpgsql;

create trigger log_update_some_table_trigger
before update on someTable
for each row execute procedure log_update_some_table();

应该可以解决问题。这将在更新发生之前修改行,而不是向队列添加另一个更新(触发递归问题)。