我有一个简单的表:无限递归检测(psycopg2,蟒2.7,Postgres的9.3)
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'时只更新'last_updated_date'和'last_updated_by'字段。我需要改变什么来防止它无限循环?我是否摆脱了“DO ALSO”条款? – Teboto 2015-02-10 02:03:39