检查触发器 WHEN 子句中的 jsonb 对象值

时间:2021-03-15 16:03:59

标签: json postgresql triggers jsonb

我在 postgresql 12 中有一个触发器像这样触发:

WHEN (OLD.some_jsonb_object_column IS DISTINCT FROM NEW.some_jsonb_object_column)

我只想在值改变时运行这个触发器,如果​​只有键改变了,我不想运行它们。在这个用例中,可以保证我们不会同时添加和删除密钥。我不知道提前对象键是什么,所以我无法通过 ->> 获取值。

我尝试过类似的东西:

WHEN (jsonb_each(OLD.some_jsonb_object_column) IS DISTINCT FROM jsonb_each(NEW.some_jsonb_object_column))

导致错误: set-returning functions are not allowed in trigger WHEN conditions

有没有办法在不使用集合返回函数的情况下获取 jsonb 对象的值?

1 个答案:

答案 0 :(得分:1)

要测试是否添加了新密钥:

key_added := EXISTS (SELECT *
                     FROM json_object_keys(NEW.some_jsonb_object_column) AS n
                     EXCEPT
                     SELECT *
                     FROM json_object_keys(OLD.some_jsonb_object_column) AS o
                    );

同样,您可以检查密钥是否被移除。

那应该可以解决您的问题。

相关问题