Il peut être possible d'appliquer cela en combinant une vue matérialisée (MV) et une contrainte sur le MV comme je l'ai décrit ici sur mon blog .
L'idée serait de créer un MV qui ne contiendrait que des exceptions à la règle, puis d'avoir une contrainte qui échoue toujours lorsqu'une ligne est entrée dans le MV. Quelque chose comme ça :
create materialized view check_mv
refresh complete on commit as
select 1 dummy
from catalogue c1, catalogue c2
where c1.next_id = c2.previous_id and c1.parent_id != c2.parent_id
alter table check_mv
add constraint check_mv_chk
check (1=0) deferrable;