Postgres 'after insert or update' 触发器未触发
Postgres 'after insert or update' trigger isn't firing
我已经将我们的数据库从 Oracle 迁移到 Postgres。其中一个步骤是保存记录状态历史记录的副本。我通过主 table 上的插入、更新触发器来执行此操作。触发器检查状态是否已更改,如果已更改,则将记录添加到状态历史记录 table.
CREATE OR REPLACE FUNCTION SAMPLE_STATUS_HISTORY_Trigger()
RETURNS TRIGGER AS $$
BEGIN
IF( old.STATUS_CODE != new.STATUS_CODE ) THEN
INSERT INTO SAMPLE_STATUS_HISTORY( analyte_status_history_id, sample_result_id, STATUS_CODE, status_date, status_user_id )
VALUES( nextval('SAMPLE_ANALYTE_STATUS_HIST_SEQ'), new.sample_result_id, new.STATUS_CODE, new.status_date, new.status_user_id );
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER TRG_SAMPLE_ANALYTE_STATUS_HIST
AFTER INSERT OR UPDATE ON SAMPLE_RESULTS
FOR EACH ROW
EXECUTE PROCEDURE SAMPLE_STATUS_HISTORY_Trigger()
;
我已确保触发器已绑定到 table。
主要应用程序是一个使用 NHibernate 的 .NET MVC 应用程序。事物在事务中工作,但事务对主要 table 的 insert/updates.
有效
我唯一的猜测是触发器逻辑中存在语法错误,但如果我手动 运行 插入或更新语句,则看不到错误。
对于 insert
,OLD.?
为空,因此不等式检查也将 return 为空。
改为使用
IF( old.STATUS_CODE IS DISTINCT FROM new.STATUS_CODE ) THEN
对于 old. 具有 null 值的 INSERT 导致我出现问题我尝试了@JGH 的建议。我最终得到了这段感觉很脏的代码:
IF( TG_OP = 'INSERT' OR old.STATUS_CODE <> new.STATUS_CODE ) THEN
我仍然不明白为什么原始代码不适用于 UPDATE 语句。这个和那个之间的唯一区别是 !=。也许这是 plpgsql 的语法问题?
无论哪种方式,这似乎都适用于 SQL window 和应用程序。
我已经将我们的数据库从 Oracle 迁移到 Postgres。其中一个步骤是保存记录状态历史记录的副本。我通过主 table 上的插入、更新触发器来执行此操作。触发器检查状态是否已更改,如果已更改,则将记录添加到状态历史记录 table.
CREATE OR REPLACE FUNCTION SAMPLE_STATUS_HISTORY_Trigger()
RETURNS TRIGGER AS $$
BEGIN
IF( old.STATUS_CODE != new.STATUS_CODE ) THEN
INSERT INTO SAMPLE_STATUS_HISTORY( analyte_status_history_id, sample_result_id, STATUS_CODE, status_date, status_user_id )
VALUES( nextval('SAMPLE_ANALYTE_STATUS_HIST_SEQ'), new.sample_result_id, new.STATUS_CODE, new.status_date, new.status_user_id );
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER TRG_SAMPLE_ANALYTE_STATUS_HIST
AFTER INSERT OR UPDATE ON SAMPLE_RESULTS
FOR EACH ROW
EXECUTE PROCEDURE SAMPLE_STATUS_HISTORY_Trigger()
;
我已确保触发器已绑定到 table。
主要应用程序是一个使用 NHibernate 的 .NET MVC 应用程序。事物在事务中工作,但事务对主要 table 的 insert/updates.
有效我唯一的猜测是触发器逻辑中存在语法错误,但如果我手动 运行 插入或更新语句,则看不到错误。
对于 insert
,OLD.?
为空,因此不等式检查也将 return 为空。
改为使用
IF( old.STATUS_CODE IS DISTINCT FROM new.STATUS_CODE ) THEN
对于 old. 具有 null 值的 INSERT 导致我出现问题我尝试了@JGH 的建议。我最终得到了这段感觉很脏的代码:
IF( TG_OP = 'INSERT' OR old.STATUS_CODE <> new.STATUS_CODE ) THEN
我仍然不明白为什么原始代码不适用于 UPDATE 语句。这个和那个之间的唯一区别是 !=。也许这是 plpgsql 的语法问题?
无论哪种方式,这似乎都适用于 SQL window 和应用程序。