首页 > 解决方案 > 在更新触发器上排除/忽略某些列

问题描述

我想排除某些列在更新时触发触发器,我尝试了此处显示的代码的几种变体,但是当更新前不为空时它不起作用(不更新import_timestamp) 。processed_on

我尝试添加这个注释掉的 OR 子句,但仍然相同。有任何想法吗?

预期的行为是import_timestamp在除 之外的任何列上更新更新processed_on,并且不要在更新时更新它processed_on(更新不可能processed_on在与其他列相同的事务中发生)。

DBFIDDLE

create table test
(
    id serial,
    some_value integer,
    import_timestamp timestamp,
    processed_on timestamp
);

insert into test(some_value, import_timestamp, processed_on) 
values (1312, '2021-02-02 20:00:00', '2021-02-02 20:44:00'),
       (124, '2021-02-02 20:10:00', null),
       (500, '2021-02-02 20:20:00', null);
 
 
CREATE OR REPLACE FUNCTION trg_update_import_timestamp (
)
RETURNS trigger AS
$body$
BEGIN
    IF OLD.processed_on = NEW.processed_on 
    --OR (OLD.processed_on = null AND NEW.processed_on = null)
    THEN    NEW.import_timestamp = now();
    ELSE 
        NEW.import_timestamp = OLD.import_timestamp;
    
END IF;
    RETURN NEW; 
END;
$body$
LANGUAGE 'plpgsql';


CREATE TRIGGER test_update_trg 
  BEFORE UPDATE 
  ON test
  
FOR EACH ROW 
  EXECUTE PROCEDURE trg_update_import_timestamp();
  
  update test set some_value  = 444 where id in (1,3);
select * from test order by 1

标签: sqlpostgresqltriggers

解决方案


如果我理解正确,您需要一个新import_timestamp的第 1 行和第 3 行。我相信这可以满足您的要求:

CREATE OR REPLACE FUNCTION trg_update_import_timestamp (
)
RETURNS trigger AS
$body$
BEGIN
    IF OLD.processed_on is not distinct from NEW.processed_on 
    THEN NEW.import_timestamp = now();
    ELSE NEW.import_timestamp = OLD.import_timestamp;
    
END IF;
    RETURN NEW; 
END;
$body$
LANGUAGE 'plpgsql';

是一个 db<>fiddle。


推荐阅读