【问题标题】:How do I make a trigger to update a column in another table?如何触发更新另一个表中的列?
【发布时间】:2014-06-06 07:20:31
【问题描述】:

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

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

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

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 触发器有什么想法吗?

【问题讨论】:

    标签: postgresql triggers


    【解决方案1】:

    mydatabase 是一个非常不幸的 schema 名称。

    触发函数可能如下所示:

    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 经常使用,那么您的第一种方法可能会奏效。

    【讨论】:

    • 是的,与我的同事交谈后,我们想出了一个更好的解决方法是向所有适用的表添加一个更新的列并进行查询。感谢你的回答! (另外,mydatabase 是我用来替换模式名称的东西,因为显然我是个傻瓜。我向你保证这不是实际使用的模式名称)。
    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 2011-02-10
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多