簡體   English   中英

在插入之前創建觸發器

[英]create a trigger before insert

我想在插入之前創建一個觸發器,並在觸發器函數中檢查要插入的新行的summary_id值,以查看表中是否已存在summary_id。 如果存在,則觸發器應返回null,因為我不想插入重復的值。 我已經編寫了此函數,但是,當我嘗試添加新的重復行時,它已成功插入!

CREATE OR REPLACE FUNCTION trigger_ack_bi()
RETURNS trigger AS $$
--DECLARE
--    max_points INTEGER;
BEGIN

   IF(TG_OP = 'INSERT') THEN
        IF NEW.ack_summary_id = (SELECT ack_summary_id FROM scm_main.tbl_ack WHERE scm_main.tbl_ack.ack_summary_id = NEW.ack_summary_id LIMIT 1) THEN
               RETURN NULL;
        ELSE
               RETURN NEW;
        END IF;

    END IF;
END;
$$LANGUAGE plpgsql;

CREATE TRIGGER trigger_ack_bi BEFORE INSERT ON
scm_main.tbl_ack
FOR EACH ROW
EXECUTE PROCEDURE trigger_ack_bi()


ALTER FUNCTION trigger_ack_bi() OWNER TO postgres;

我建議將列設置為NOT NULL並在其上創建PK ...

alter table scm_main.tbl_ack alter column ack_summary_id set NOT NULL;
alter table scm_main.tbl_ack add primary key (ack_summary_id);

看來觸發功能是正確的。 但是,它以靜默模式運行。 我需要提出一個例外來確保避免重復。 感謝您的其他解決方案。

    CREATE OR REPLACE FUNCTION trigger_ack_bi()
RETURNS trigger AS $$
--DECLARE
--    max_points INTEGER;
BEGIN

   IF(TG_OP = 'INSERT') THEN
        IF NEW.ack_summary_id IS NULL THEN
             RAISE EXCEPTION 'summaryID cannot be null';
        END IF;

        IF NEW.ack_summary_id = (SELECT ack_summary_id FROM scm_main.tbl_ack WHERE scm_main.tbl_ack.ack_summary_id = NEW.ack_summary_id LIMIT 1) THEN
             RAISE EXCEPTION 'duplication prevented..';
               RETURN NULL;
        ELSE
               RETURN NEW;
        END IF;

    END IF;
END;
$$LANGUAGE plpgsql;

CREATE TRIGGER trigger_ack_bi BEFORE INSERT ON
scm_main.tbl_ack
FOR EACH ROW
EXECUTE PROCEDURE trigger_ack_bi()

暫無
暫無

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

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