Com o prefácio padrão de que não é assim que você realmente faria esse tipo de coisa no mundo real ...
Você realmente precisaria usar um gatilho de nível de instrução aqui. Se você não se importa com o impacto no desempenho de verificar todas as salas todas as vezes
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;
Se você não quiser verificar isso para todos os quartos todas as vezes, precisará de um pacote com uma coleção de
rid
valores, um gatilho de instrução antes que inicializou a coleção e um gatilho em nível de linha que adicionou o :new.rid
valor à coleção. Seu gatilho de instrução after iteraria sobre os elementos da coleção e verificaria o número de pessoas apenas nessas salas.