標準的な序文では、これは現実の世界で実際にこの種のことを行う方法ではありません...
ここでは、実際にはステートメントレベルのトリガーを使用する必要があります。毎回すべての部屋をチェックすることによるパフォーマンスの低下を気にしない場合
CREATE OR REPLACE TRIGGER Living_AIUD
AFTER INSERT OR UPDATE OR DELETE
ON Living
DECLARE
Count NUMBER;
BEGIN
FOR x IN (SELECT rid, count(*) cnt
FROM living
GROUP BY rid
HAVING COUNT(*) < 3)
LOOP
RAISE_APPLICATION_ERROR(-20002, 'Too few people in room ' || x.rid);
END LOOP;
END Living_AIUD;
毎回すべての部屋でこれを確認したくない場合は、rid
のコレクションを含むパッケージが必要になります。 値、コレクションを初期化したbeforeステートメントトリガー、および:new.rid
を追加した行レベルのトリガー コレクションへの価値。その後、afterステートメントのトリガーは、コレクション内の要素を繰り返し処理し、それらの部屋だけの人数を確認します。