代码之家  ›  专栏  ›  技术社区  ›  David

PostgreSQL简单触发问题

  •  1
  • David  · 技术社区  · 16 年前

    触发:

     CREATE TRIGGER "tr_update_ts" BEFORE INSERT OR UPDATE 
     ON "public"."test" FOR EACH ROW 
     EXECUTE PROCEDURE "public"."update_ts"();
    

    其功能是:

    CREATE OR REPLACE FUNCTION "public"."update_ts" () RETURNS trigger AS
    $body$
    DECLARE
    BEGIN
      NEW.ts := now();
    RETURN NEW;
    END;
    $body$
    LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
    

    为什么这不起作用?没有引发错误,但TS仍然为空…

    2 回复  |  直到 16 年前
        1
  •  2
  •   user80168    16 年前

    我测试了你的代码,它可以工作:

    首先,让我们创建表:

    # create table test (x int4, ts timestamptz);
    CREATE TABLE
    

    现在,让我们添加函数:

    # CREATE OR REPLACE FUNCTION "public"."update_ts" () RETURNS trigger AS
    >> $body$
    >> DECLARE
    >> BEGIN
    >>   NEW.ts := now();
    >> RETURN NEW;
    >> END;
    >> $body$
    >> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
    CREATE FUNCTION
    

    最后,添加一个触发器:

    #  CREATE TRIGGER "tr_update_ts" BEFORE INSERT OR UPDATE
    >>  ON "public"."test" FOR EACH ROW
    >>  EXECUTE PROCEDURE "public"."update_ts"();
    CREATE TRIGGER
    

    现在,让我们测试插入部分:

    # insert into test (x) values (1);
    INSERT 0 1
    # select * from test;
     x |              ts
    ---+-------------------------------
     1 | 2009-09-12 19:54:50.812139+02
    (1 row)
    

    很明显,它起作用了。

    现在,更新:

    # update test set x = 2;
    UPDATE 1
    # select * from test;
     x |              ts
    ---+-------------------------------
     2 | 2009-09-12 19:54:57.463933+02
    (1 row)
    

    TS已更改。显然,您所显示的代码是有效的,因此错误必须在其他地方。

    显示psql的“d test”输出和触发器函数的\df+。

        2
  •  0
  •   Steve K    16 年前

    创建函数的完整语法是什么?下面是我创建的函数的完整语法,它按预期工作。

    create function update_timestamp() RETURNS trigger AS $$
    BEGIN
      NEW.ts := now();
    RETURN NEW;
    END;
    $$ language plpgsql;