Con el prefacio estándar de que así no es como harías este tipo de cosas en el mundo real...
De manera realista, necesitaría usar un disparador de nivel de declaración aquí. Si no le importa el impacto en el rendimiento de revisar cada habitación cada vez
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;
Si no desea verificar esto para cada habitación cada vez, necesitaría un paquete con una colección de rid
valores, un disparador de declaración anterior que inicializó la colección y un disparador de nivel de fila que agregó el :new.rid
valor a la colección. Su activador de declaración posterior iteraría sobre los elementos de la colección y verificaría la cantidad de personas en solo esas habitaciones.