Със стандартния предговор, че това не е начинът, по който наистина бихте направили подобни неща в реалния свят...
Реално ще трябва да използвате тригер на ниво изявление тук. Ако нямате нищо против намаляването на производителността от проверката на всяка стая всеки път
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
стойности, тригер преди изявление, който инициализира колекцията, и тригер на ниво ред, който добавя :new.rid
стойност за колекцията. След това тригерът ви след израз ще премине през елементите в колекцията и ще провери броя на хората само в тези стаи.