如何在PostreSql触发器函数中从OLD和NEW对象中排除列



我有一个场景,在某种更新之前激活一个触发函数。为了满足条件,必须将其中一列从"旧的";以及";NEW";对象。

CREATE FUNCTION example_function() RETURNS trigger AS
$example_function$
BEGIN
IF
(OLD <> NEW) IS TRUE THEN
//Do something here
END IF;
RETURN NEW;
END;
$example_function$
LANGUAGE plpgsql;

CREATE TRIGGER example_function
BEFORE UPDATE
ON some_table
FOR EACH ROW
EXECUTE PROCEDURE example_function();

问题是,该表有50多列,之后很难键入或维护。

我想排除的列——比如说modified_date——每次都会满足不同的条件,但如何才能完全排除在检查之外?

(OLD<>NEW exclude-modified_date(为真,然后-类似的事情应该在逻辑上发生

也许您可以使用这样的代码,其中tab是带有触发器的表:

DECLARE
oldrow tab := OLD;
newrow tab := NEW;
BEGIN
oldrow.modified_date := NULL;
newrow.modified_date := NULL;
IF oldrow IS DISTINCT FROM newrow THEN
/* whatever */
END IF;
RETURN NEW;
END

您可以比较不包括所选列的记录的JSON表示:

...
if to_jsonb(new)- 'modified_date' <> to_jsonb(old)- 'modified_date' then
...

最新更新