複数のセッションが更新を行っている場合でも、健全で正しいようにこれを行うのは簡単ではありません。これをトリガーで試してみると、混乱することになります。Oracleの宣言型制約は、これを表現するのに十分なほど強力ではありません。
次のように実行できます。-
- 親テーブルと子テーブルの両方にマテリアライズドビューログを作成します
- それらを結合し、親によってグループ化された子の数をカウントするマテリアライズド結合ビューを作成します。これは、コミット時に更新する必要があります
- 子レコードの数が「n」(データベース定数)に等しくなければならないという制約をマテリアライズド結合ビューに設定します
その後、一連の挿入/更新/削除ステートメントを実行できます。コミットすると、マテリアライズドビューが更新され、条件が満たされない場合、その時点で制約違反エラーが発生します。
ちょっとしたコツは、制約に失敗した行のみをマテリアライズドビューに含めることです(HAVING count(ChildId)<> 5)。これにより、ストレージスペースを無駄にすることはありません。