Это не может быть сделано с проверочным ограничением, потому что они могут смотреть только на значения в строке, которая вставляется или обновляется, а не на другие таблицы или другие строки в той же таблице.
Я экспериментировал сподход с использованием материализованных представлений и проверочных ограничений - см. мой блог .Хитрость заключается в том, чтобы создать материализованное представление исключений из правила - то есть материализованное представление, которое всегда должно быть пустым.Затем добавьте проверочное ограничение к MV, которое всегда терпит неудачу, например, CHECK (1 = 0).
Для вашей ситуации решение будет выглядеть примерно так:
create materialized view emp_emp_mv
refresh complete on commit as
select 1 dummy
from emp e1, emp e2
where e1.empno != e2.empno
and e1.rank < e2.rank
and e1.sal > e2.sal;
alter table emp_emp_mv
add constraint emp_emp_mv_chk
check (1=0) deferrable;
Обратите внимание:
- Я не проверял приведенный выше пример
- Я никогда не использовал этот подход в «реальной» системе, только в экспериментах.