В идеальном мире Oracle и другие СУБД будут поддерживать «утверждения»:
create assertion no_more_than_50_per_user as
check(not exists(select null
from a join b on ...
where a.detailed = 'Y'
and b.details is null
);
Хотя они этого не делают (и не без веской причины: было бы очень сложно реализовать их с точки зрения производительности!)
Как предлагает Quassnoi, вместо этого можно использовать триггеры - но вы должны знать об опасностях в многопользовательской среде. Чтобы быть уверенным в обеспечении согласованности, вам нужно снимать блокировки при проверке данных, чтобы этого не происходило:
(Предположим, что в записи 1 в настоящее время указано подробное = 'N', но все связанные записи B содержат детали, не равные нулю).
user1> Update A set detailed = 'Y' where a_id=1;
Это работает, потому что все связанные строки B содержат детали, не равные NULL.
user2> Update B set details = null where a_id=1;
Это работает, потому что user1 еще не зафиксировал, поэтому триггер user2 видит подробный = 'N'.
user1> commit;
user2> commit;
Теперь у вас есть поврежденные данные. Чтобы предотвратить это, триггер на B должен выбрать строку A «для обновления».