访问一行,开始触发

时间:2011-04-11 07:33:11

标签: postgresql triggers plpgsql

我知道有很多方法可以在触发器定义中访问查询类型,表名,oid等:

http://www.postgresql.org/docs/8.3/static/plpgsql-trigger.html

无论如何,我是否有可能在一行上运行UPDATE,启动触发器而不需要用唯一ID标记表中的每一行?

e.g。如果我有用于存储日志的表,我不需要任何唯一的ID ...并且随着时间的推移,实际上可能会出现一些行,这将是相等的。

CREATE TABLE users_log
(
  uid bigint NOT NULL,
  event smallint NOT NULL,
  source character varying,
  event_time timestamp with time zone
)

我知道,由于“带时区的时间戳”数据类型的微秒精度是这种情况几乎不可能,但并非真的不可能......

那么如何在触发器中编写查询以便能够仅更新插入的行?

$BODY$BEGIN
    UPDATE "users_log" SET "event_time" = now(); -- this updates all rows

    -- WHERE "id" = NEW.id; - this is what i don't want

    RETURN NEW;
END;$BODY$

1 个答案:

答案 0 :(得分:2)

您只需在触发器中使用:

$BODY$BEGIN
    NEW.event_time = now();
    RETURN NEW;
END;$BODY$

它只是有效 - 无需额外更新。您需要将此触发器声明为BEFORE TRIGGER。