如何触发更新另一个表中的列?

时间:2014-06-05 22:58:34

标签: postgresql triggers

所以我正在为我的应用服务器添加上次更新的数据库时间。我们的想法是,它将记录更新应用于我们的一次旅行的时间,然后应用程序可以发送获取请求,以确定它是否具有所有正确的最新信息。

我已经将列添加到了我们的表中,并为它提供了所有服务,最后设法在每次对其行程表中的行程进行更改时获取触发器来更新列。我的问题现在来自这样一个事实:与旅行相关的信息也存储在许多其他表中(例如,有组成旅行的路线表和用户可以看到的照片。旅行等...)如果任何数据发生变化,那么行程的更新时间也需要改变。我不能为我的生活弄清楚如何设置触发器,以便当我更改一些路线信息时,路线所属行程的最后更新时间将在其表中更新。

这是我现在的触发代码:当行程的行更新时,它会更新行程表的最后更新列。

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触发器的人的想法比我?

1 个答案:

答案 0 :(得分:2)

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;

需要在每个相关表上的触发器中使用(不在trip本身上):

CREATE TRIGGER upaft_upd_trip
AFTER UPDATE ON mydatabase.trip_detail
FOR EACH ROW EXECUTE PROCEDURE trg_upaft_upd_trip();

您还需要在所有子表上涵盖INSERTDELETE(以及可能COPY)......

这种方法有许多潜在的失败点。或者,考虑一个动态地从子表计算最新last_updated的查询或视图。如果您经常更新,这可能是更好的方法 如果您经常UPDATESELECT,您的第一种方法可能会付费。