Postgresql - 防止更新发生的功能

Postgresql - Function to prevent UPDATE from occurring

使用 PostgreSQL 11.6。如果不同的列数据满足特定条件,我想防止在给定列上发生更新。我认为最好的方法是在更新之前通过事件触发器。

目标:如果列 'sysdescr' = 'no_response' 则不更新列 'snmp_community'。

我在下面的函数中尝试的是 skip/pass 在满足该条件时的给定更新。但它会阻止任何更新,即使条件不匹配也是如此。

CREATE OR REPLACE FUNCTION public.validate_sysdescr()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$BEGIN
    IF NEW.sysdescr = 'no_response' THEN
        RETURN NULL;
    ELSE
        RETURN NEW;
    END IF;
END;
$function$;

注意:我认为使用某种类型的 'skip' 操作可能是最好的,以使函数更易于重用。但如果我需要调出特定列不更新 (snmp_community) 也没关系。

将程序更改为:

CREATE OR REPLACE FUNCTION public.validate_sysdescr()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$BEGIN
    IF NEW.sysdescr = 'no_response' THEN
        NEW.snmp_community = OLD.snmp_community ;
    END IF;
    RETURN NEW;
END;
$function$;

并将其关联到公共更新触发器:

CREATE TRIGGER validate_sysdescr_trg  BEFORE UPDATE ON <YOUR_TABLE>
    FOR EACH ROW
    EXECUTE PROCEDURE public.validate_sysdescr();