Я признаю, что это может быть излишним.Если вы можете создать быстро обновляемое материализованное представление с обновлением при фиксации с определением, которое будет подсчитывать количество неверных значений в вашей таблице (возможно, что-то вроде ниже):
select count(*) as rows_with_errors
from data_table a
join lookup_table b on(a.caption = b.caption);
Запрос долженвернуть счетчик нуля, потому что значения в data_table не могут содержать значения в lookup_table.Затем вы создаете проверочное ограничение для самого материализованного представления, CHECK (row_with_errors = 0).
Каждый раз, когда обновление или вставка фиксируется в data_table, материализованное представление обновляется.Но (и вот в чем дело), если вы ввели значение в data_table, которое существует в lookup_table, count (*) вернет ненулевое значение, что приведет к сбою проверочного ограничения для материализованного представления, то есть всегооператор вставки / обновления завершится ошибкой / откатом.Voila!