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

cbh*_*edd 5 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;
Run Code Online (Sandbox Code Playgroud)

现在,当用外键引用行的行更新时,我需要更新它。对SQL触发器比我更有经验的人有什么想法吗?

Erw*_*ter 3

“mydatabase”对于模式来说是一个非常不幸的名称。

触发函数可能如下所示:

CREATE OR REPLACE FUNCTION trg_upaft_upd_trip()
  RETURNS trigger
  LANGUAGE plpgsql 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$;
Run Code Online (Sandbox Code Playgroud)

并且需要在每个相关表(而不是trip其本身)的触发器中使用:

CREATE TRIGGER upaft_upd_trip
AFTER UPDATE ON mydatabase.trip_detail
FOR EACH ROW EXECUTE PROCEDURE trg_upaft_upd_trip();
Run Code Online (Sandbox Code Playgroud)

您还需要覆盖所有子表上的INSERTand DELETE(可能还有)......COPY

这种方法有许多潜在的失败点。last_updated作为替代方案,请考虑使用动态计算子表中最新数据的查询或视图。如果您经常更新,这可能是更好的方法。
如果您很少UPDATESELECT经常这样做,那么您的第一种方法可能会有所回报。