postgresql - 访问启动触发器的行

标签 postgresql triggers plpgsql

我知道有一些方法可以访问触发器定义中的查询类型、表名、oid 等:

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

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

例如如果我有用于存储日志的表,我在这里不需要任何唯一 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$

最佳答案

您只需在触发器中使用:

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

而且它可以正常工作——不需要额外的更新。不过,您需要将此触发器声明为 BEFORE TRIGGER。

关于postgresql - 访问启动触发器的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5618170/

相关文章:

postgresql - 如何使用 BEFORE 触发器防止在 PostgreSQL 中的继承表上插入、更新和删除

sql - Postgres 函数创建但不执行

postgresql - 是否有替代 PostgreSQL 中的临时表来保存和操作结果集?

sql - 如何遍历查询结果

python - 修复列 "date_of_birth"中的空值违反了非空约束

sql - 在 Postgres 中插入自定义类型的数组

jquery - PostgreSQL 9.3 -> 来自嵌套集的 JSON -> jQuery ListView

sql - 当某些列 = 0 时动态删除记录;数据清理

database - PostgreSQL 中是否有针对大型二进制数据的透明重复数据删除?

MySQL 检查触发器内的事件事务