【问题标题】:Trigger on BEFORE INSERT OR UPDATE fired once or twice?在插入或更新之前触发一次或两次?
【发布时间】:2020-09-25 17:30:26
【问题描述】:

我已经创建了以下触发器;

CREATE TRIGGER material_trigger
    BEFORE INSERT OR UPDATE ON materials
    FOR EACH ROW
    EXECUTE PROCEDURE my_proc ();

我很难理解 my_proc 何时会在 upsert 查询上运行,如下所示:

--UPSERT
INSERT INTO materials (id, col)
VALUES (1, 1)
ON CONFLICT (id) DO UPDATE SET
col='x'

如果我正在运行 upsert,我是否正确地认为:

  • 如果是INSERT,它将运行一次
  • 如果是UPDATE,它将运行两次

如果我运行这个AFTER upsert,那么逻辑上我会确保my_proc 只被触发一次?

【问题讨论】:

    标签: postgresql triggers sql-update sql-insert


    【解决方案1】:

    在执行UPDATE 的情况下,触发器实际上被触发两次。这可以使用以下方式进行演示:

    -- create table
    CREATE TABLE IF NOT EXISTS example (uuid int unique);
    -- create function
    CREATE OR REPLACE FUNCTION print_function ()
        RETURNS TRIGGER
        AS $body$
        BEGIN
        RAISE NOTICE 'Starting';
        RAISE NOTICE 'METHOD: %' , TG_OP;
        RETURN NEW;
        END;
        
        $body$
        LANGUAGE plpgsql;
    -- create trigger function
    CREATE TRIGGER example_trigger
        BEFORE INSERT OR UPDATE ON example
        FOR EACH ROW
        EXECUTE PROCEDURE print_function ();
    --  upserts
    INSERT INTO example(uuid) VALUES (1) ON CONFLICT(uuid) DO UPDATE SET uuid=5;
    INSERT INTO example(uuid) VALUES (1) ON CONFLICT(uuid) DO UPDATE SET uuid=5;
    

    给出输出:

    NOTICE:  Starting
    NOTICE:  METHOD: INSERT             -- Populated with inital value
    NOTICE:  Starting
    NOTICE:  METHOD: INSERT             -- Fired a first time for insert (can't insert as exists)
    NOTICE:  Starting
    NOTICE:  METHOD: UPDATE             -- Fired a second time for update
    INSERT 0 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多