如何在PostreSql触发器函数中排除新旧对象中的列

lymgl2op  于 2022-10-15  发布在  PostgreSQL
关注(0)|答案(2)|浏览(132)

我有一个场景,触发器功能在某种类型的更新之前被激活。并且为了满足该条件,必须将其中一列从“旧”和“新”对象中排除。

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将满足每次都不同的条件,但是如何才能从检查中完全排除它呢?

(旧<>新排除MODIFIED_DATE)为真-在逻辑上应该会发生类似的事情

jgzswidk

jgzswidk1#

也许您可以使用这样的代码,其中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
p8h8hvxi

p8h8hvxi2#

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

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

相关问题