簡體   English   中英

PostgreSQL 更新 TRIGGER 在僅更新 1 行時觸發多次

[英]PostgreSQL Update TRIGGER Fires Multiple Times When Just 1 Row Updated

源表:-

CREATE TABLE schema1.Source_Table
(
    Source_Table_id serial NOT NULL,
    current_status_id smallint NOT NULL,
    current_status_reason varchar(200) NULL,
    requestor_id integer NOT NULL,
    approver_id integer NULL,
    last_upd_user_id integer NOT NULL,
    last_upd_date_time timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
    CONSTRAINT PK_Source_Table PRIMARY KEY (Source_Table_id)
)
WITH OIDS;

目標表(審計歷史目的):-

CREATE TABLE schema2.Destination_Table
(
    type_id smallint NOT NULL,
    id integer NOT NULL,
    state_id smallint NOT NULL,
    state_reason varchar(200) NULL,
    requestor_id integer NOT NULL,
    approver_id integer NULL,
    upd_by_user_id integer NOT NULL,
    upd_by_user_type smallint NOT NULL,
    upd_date_time timestamp without time zone NOT NULL
)
WITH OIDS;

更新源表上的每個行觸發器后:-

CREATE TRIGGER trg_upd_Source_Table
   AFTER UPDATE of current_status_id
   ON schema1.Source_Table
   FOR EACH ROW
  WHEN (OLD.current_status_id IS DISTINCT FROM NEW.current_status_id)
      EXECUTE PROCEDURE schema1.Source_Table_hist();

上面每個行觸發器的更新后的觸發器函數:-

CREATE OR REPLACE FUNCTION schema1.Source_Table_hist()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS $$
BEGIN
    INSERT INTO schema2.Destination_Table
        (type_id, id, state_id, state_reason, requestor_id, approver_id, upd_by_user_id, 
        upd_by_user_type, upd_date_time)
    SELECT 1, OLD.Source_Table_id, OLD.current_status_id, OLD.current_status_reason, 
        OLD.requestor_id, OLD.approver_id, OLD.last_upd_user_id, 1, OLD.last_upd_date_time
    from schema1.Source_Table
    where OLD.current_status_id IS DISTINCT FROM NEW.current_status_id;
    RETURN NULL;
END;
$$

schema1.Source_Table 表中已經有 8 行具有唯一的主鍵 Source_Table_id。 當我使用主鍵更新此表的 1 行時,如下所示,它將 8 行(1 個原始行和 7 個副本)插入到 schema2.Destination_Table 表中,而不是僅插入 1 行。

update schema1.Source_Table
set current_status_id = 4
where Source_Table_id = 9;

這里的問題是:-當僅更新該表的 1 行時,為什么觸發器會觸發 8 次(這等於在其上創建此觸發器的表中的總行數)。

預期行為:-觸發器應僅觸發一次,然后在創建觸發器的源表中僅更新 1 行時,在目標審計表中插入 1 行。

如何解決這個問題?

觸發器不會多次觸發,您的查詢正在為源表中的每一行在 hist 表中插入一行:

    INSERT INTO schema2.Destination_Table
    (type_id, id, state_id, state_reason, requestor_id, approver_id, upd_by_user_id, 
    upd_by_user_type, upd_date_time)
SELECT 1, OLD.Source_Table_id, OLD.current_status_id, OLD.current_status_reason, 
    OLD.requestor_id, OLD.approver_id, OLD.last_upd_user_id, 1, OLD.last_upd_date_time
from schema1.Source_Table
where OLD.current_status_id IS DISTINCT FROM NEW.current_status_id;
RETURN NULL;

我認為你不需要那個 from 子句。

問題出在 WHERE 條件中:

where OLD.current_status_id IS DISTINCT FROM NEW.current_status_id

根據觸發器上的 WHEN 條件,已知此條件為真。 因為它是唯一有效的 WHERE,所以完全沒有 WHERE 條件,因此所有魚子都由插入物處理。 建議

where current_status_id = OLD.current_status_id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM