我在 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 对象的值?
答案 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
);
同样,您可以检查密钥是否被移除。
那应该可以解决您的问题。