使用PostgreSQL 11.6。如果不同的列数据满足某些条件,我想防止在给定的列上发生UPDATE。我认为最好的方法是在更新之前通过事件触发器。
目标:如果列'sysdescr'='no_response',则不要更新列'snmp_community'。
我在下面的函数中尝试的是在满足该条件时跳过/传递给定的更新。但是,即使条件不匹配,它也会阻止任何更新。
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$;
注意:我当时想使用某种“跳过”操作可能是最好的,以使该功能更可重用。但是,如果我需要调出特定的列以不进行更新(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();