所以我正在为我的应用服务器添加最后更新的数据库时间.我们的想法是,它将记录更新应用于我们的一次旅行的时间,然后应用程序可以发送获取请求,以确定它是否具有所有正确的最新信息.
我已经将列添加到了我们的表中,并为它提供了所有服务,最后设法在每次对其行程表中的行程进行更改时获取触发器来更新列.我的问题现在来自这样一个事实:与旅行相关的信息也存储在许多其他表中(例如,有组成旅行的路线表和用户可以看到的照片.旅行等…)如果任何数据发生变化,那么行程的更新时间也需要改变.我不能为我的生活弄清楚如何设置触发器,以便当我更改一些路线信息时,路线所属行程的最后更新时间将在其表中更新.
这是我现在的触发代码:当行程的行更新时,它会更新行程表的最后更新列.
CREATE OR REPLACE FUNCTION record_update_time() RETURNS TRIGGER AS $$ BEGIN NEW.last_updated=now(); RETURN NEW; END; $$ LANGUAGE PLPGsql; CREATE TRIGGER update_entry_on_entry_change BEFORE UPDATE ON mydatabase.trip FOR EACH ROW EXECUTE PROCEDURE record_update_time(); --I used the next two queries just to test that the trigger works. It --probably doesn't make a difference to you but I'll keep it here for reference UPDATE mydatabase.trip SET title='Sample New Title' WHERE id = 2; SELECT * FROM mydatabase.trip WHERE mydatabase.trip.id < 5;
现在我需要它来更新引用带有外键的行的行的行更新.来自更有经验的sql触发器的人的想法比我的?
解决方法
mydatabase是一个非常不幸的架构名称.
触发器功能可能如下所示:
CREATE OR REPLACE FUNCTION trg_upaft_upd_trip() RETURNS TRIGGER AS $func$ BEGIN UPDATE mydatabase.trip t -- "mydatabase" = schema name (?!) SET last_updated = now() WHERE t.id = NEW.trip_id -- guessing column names RETURN NULL; -- calling this AFTER UPDATE END $func$ LANGUAGE plpgsql;
并且需要在每个相关表上的触发器中使用(而不是在旅行本身上):
CREATE TRIGGER upaft_upd_trip AFTER UPDATE ON mydatabase.trip_detail FOR EACH ROW EXECUTE PROCEDURE trg_upaft_upd_trip();
您还需要在所有子表上覆盖INSERT和DELETE(以及可能的COPY)…
这种方法有许多潜在的失败点.或者,考虑一个动态地从子表计算最新last_updated的查询或视图.如果您经常更新,这可能是更好的方法.如果你很少经常更新和选择,你的第一种方法可能会付出代价.