Ze standardowym przedmową, że tak naprawdę nie robiłbyś tego rodzaju rzeczy w prawdziwym świecie...
Realistycznie musiałbyś użyć tutaj wyzwalacza na poziomie instrukcji. Jeśli nie masz nic przeciwko hitowi wydajności polegającemu na sprawdzaniu każdego pokoju za każdym razem
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;
Jeśli nie chcesz za każdym razem sprawdzać tego dla każdego pokoju, potrzebujesz pakietu z kolekcją rid
wartości, wyzwalacz instrukcji before, który zainicjował kolekcję, oraz wyzwalacz na poziomie wiersza, który dodał :new.rid
wartość do kolekcji. Twój wyzwalacz po oświadczeniu będzie następnie iterował po elementach w kolekcji i sprawdzał liczbę osób w tylko tych pokojach.