“代替更新”触发器:如何区分用户何时为列提供新值,何时不提供?

时间:2019-01-15 11:30:12

标签: postgresql

在触发器NEW.field值内始终具有<some value>,尽管该列是否出现在UPDATE语句的SET列表上或没有:

UPDATE test SET name = 'abc', field = <some value>;
UPDATE test SET name = 'abc';

对于触发器中的两个查询,我将获得field<some value>

有没有办法从触发器内部区分这两个查询?

1 个答案:

答案 0 :(得分:0)

我认为您可以将新值与旧值进行比较。如果不同,则您知道该字段已设置。

除非您想在字段更新时捕获,即使字段值没有变化,我也认为这可以捕获。

CREATE OR REPLACE FUNCTION test_update_trigger()
  RETURNS trigger AS
$BODY$
BEGIN

  if (OLD.field is null and NEW.field is not null or
      OLD.field is not null and NEW.field is null or
      OLD.field != NEW.field) then
    -- do something
  end if;

  return NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;