これには、SQL標準で定義されているが、Oracleでは実装されていないアサーションが必要です。 (それらを導入する動き がありますが 。
マテリアライズドビューを使用して透過的に適用することができます。
create materialized view project_manager
refresh on commit
as
select Project_manager_employee_id
, count(*) as no_of_projects
from project
group by Project_manager_employee_id
/
魔法は:
alter table project_manager
add constraint project_manager_limit_ck check
( no_of_projects <= 3 )
/
このチェック制約は、マネージャーのプロジェクトの数が3を超えた場合にマテリアライズド・ビューが更新されるのを防ぎます。これが失敗すると、トリガーとなる挿入または更新が失敗します。確かにそれはエレガントではありません。
mviewはコミット時に(つまりトランザクション的に)更新されるため、project
でログを作成する必要があります 表:
create materialized view log on project