2016-11-03 67 views
0

当一行更新触发器将更改该行时,我创建了一个触发器。当我更新一列时,我收到一个错误。我该如何解决?Postgresql触发器示例

ERROR: stack depth limit exceeded HINT: Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate.

CREATE OR REPLACE FUNCTION ynt_call() 
RETURNS TRIGGER AS $$ 
BEGIN 
    IF TG_OP = 'UPDATE' THEN 
     UPDATE ynt.a_test SET date_time = now(); 
    END IF; 
    RETURN NEW; 
END; 
$$ language 'plpgsql'; 
CREATE TRIGGER update_call AFTER UPDATE ON ynt.a_test FOR EACH ROW EXECUTE PROCEDURE ynt_call(); 
+0

看起来您处于无限循环状态。要更改触发器中的值,请使用** new **和** old **关键字。 – ChrisB

+0

您应该仔细查看手册中的示例:https://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE –

回答

1

,当然你会循环,直到时间的尽头,因为你正在更新行时更新一行。您应该使用特殊变量new设置字段date_time,如下所示:

CREATE OR REPLACE FUNCTION ynt_call() 
RETURNS TRIGGER AS $$ 
BEGIN 
    IF TG_OP = 'UPDATE' THEN 
     new.date_time = now(); 
    END IF; 
    RETURN NEW; 
END; 
$$ language 'plpgsql'; 
CREATE TRIGGER update_call AFTER UPDATE ON ynt.a_test FOR EACH ROW EXECUTE  PROCEDURE ynt_call();