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();
使用 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();