我知道有很多方法可以在触发器定义中访问查询类型,表名,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$
答案 0 :(得分:2)
您只需在触发器中使用:
$BODY$BEGIN
NEW.event_time = now();
RETURN NEW;
END;$BODY$
它只是有效 - 无需额外更新。您需要将此触发器声明为BEFORE TRIGGER。