Triggers  - Soluções


1) Crie um trigger que impeça a inserção de um aluguer cuja data (de aluguer)
 é inferior à data de nascimento do sócio.

sqlite> CREATE TRIGGER TrigImpedeAluguerAntesDoSocioNascer BEFORE INSERT ON aluguer
 BEGIN  
SELECT CASE  
 WHEN (select 1 from socio where num_socio = NEW.num_socio and 
 julianday(data_nsc_socio) >= julianday(NEW.data_aluguer))
THEN
 RAISE(ABORT,'Nao pode alugar videos antes de nascer')
 END;
END;


2) Crie um trigger que impeça a inserção de um aluguer de uma cópia de filme que está alugada.

%solução em dois passos. Primeiro cria-se uma view que indica o preríodo em que cada cópia
esteve ou ainda está alugada.

sqlite> Create view copiasalugadas as select cod_filme,num_copia,data_aluguer,
date('now') as data_fim from aluguer where cod_filme||' '||num_copia||' '||data_aluguer not in
 (select cod_filme||' '||num_copia||' '||data_aluguer from devolucao)
 union
 select cod_filme,num_copia,data_aluguer,data_devolucao from aluguer natural inner join
  devolucao;
  
 %agora cria-se o trigger:
 
 sqlite> CREATE TRIGGER TrigImpedeAluguerDeCopiaAlugada BEFORE INSERT ON aluguer
 BEGIN  
SELECT CASE  
 WHEN (select 1 from copiasalugadas where cod_filme = NEW.cod_filme and
  num_copia = NEW.num_copia and julianday(NEW.data_aluguer) between
 julianday(data_aluguer) and julianday(data_fim))
THEN
 RAISE(ABORT,'Essa cópia está emprestada. Não pode ser alugada')
 END;
END;