我创建了下表:
CREATE TABLE updates
(
"table" text,
last_update timestamp without time zone
)
我想在任何表更新时更新它,问题是我不知道怎么样,有人可以帮我把这个伪代码变成触发器吗?
this = current table on whitch operation is performed
ON ALTER,INSERT,DELETE {
IF (SELECT COUNT(*) FROM updates where table = this) = 1
THEN
UPDATE updates SET last_update = timeofday()::timestamp WHERE `table`=this
ELSE
INSERT INTO updates VALUES (this,timeofday()::timestamp);
}
答案 0 :(得分:1)
您需要一个触发器函数,只要您的某个表被“更新”,就会调用它,假设您的意思是成功执行了INSERT
,UPDATE
或DELETE
。该触发器功能如下所示:
CREATE FUNCTION log_update() RETURNS trigger AS $$
BEGIN
UPDATE updates SET last_update = now() WHERE "table" = TG_TABLE_NAME;
IF NOT FOUND THEN
INSERT INTO updates VALUES (TG_TABLE_NAME, now());
END IF;
IF (TG_OP = 'DELETE') THEN
RETURN OLD;
ELSE
RETURN NEW;
END IF;
END; $$ LANGUAGE PLPGSQL;
每个必须以这种方式记录的表都需要有一个与之关联的触发器,如下所示:
CREATE TRIGGER ZZZ_mytable_log_updates
AFTER INSERT OR UPDATE OR DELETE ON mytable
FOR EACH ROW EXECUTE PROCEDURE log_update();
一些评论:
TG_TABLE_NAME
。oid
,并使用相关的TG_RELID
自动参数。它占用的存储空间更少,速度更快,并且避免了数据库的不同模式中具有相同名称的表之间的混淆。您可以使用pg_tables
系统目录表从oid中查找表名。INSERT
和UPDATE
操作需要返回NEW
; DELETE
需要OLD
返回。