Minha dúvida é, como eu faço uma trigger pra não permitir alteração numa tabela(pai), se a tabela filha teve um produto vendido.
Aqui o enunciado pra ficar mais claro:
Criar uma trigger para não permitir que ocorra a alteração do fabricante de cada
produto a partir do momento que ocorreu uma venda para esse determinado produto. Dessa forma,
produtos que já foram vendidos jamais poderão ter seu fabricante modificado.
CREATE OR REPLACE FUNCTION alter_fab() RETURNS TRIGGER
AS $alter_fab$
BEGIN
IF EXISTS(SELECT * from FABRICANTE INNER JOIN PRODUTO
ON(fabricante.i_fabricantes = produto.i_fabricantes)
INNER JOIN ITEM
ON(item.i_produtos = produto.i_produtos)
INNER JOIN VENDA
ON(venda.i_vendas = item.i_vendas)) THEN
RAISE EXCEPTION 'Fabricante não pode ser alterado, pois existem produtos vendidos para esse fabricante!';
ELSE
RETURN NEW;
END IF;
END;
$alter_fab$ LANGUAGE plpgsql;
O enunciado pede que seja criado um trigger, não uma function.
A sintaxe do trigger é diferente.
Deverá ser mais ou menos assim o que pretendes:
CREATE TRIGGER alter_fab -- cria o trigger
BEFORE UPDATE on PRODUTO -- define quando é disparado
FOR EACH ROW -- verificação de cada linha que vai ser feito update
BEGIN -- começa a lógica
IF old.i_fabricantes != new.i_fabricantes -- verifica se o fabricante foi alterado
and EXISTS (SELECT * FROM item i -- e se existem vendas
INNER JOIN VENDA ON(venda.i_vendas = item.i_vendas)
where i.i_produtos = NEW.i_produtos then
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Não pode alterar o vendedor';
end;
END; -- termina o trigger
Dá erro no new.i_produtos do WHERE, pois não existe i_produtos na tabela fabricante, segue o erro:
ERROR: record "new" has no field "i_produtos"
CONTEXT: SQL statement "SELECT old.i_fabricantes != new.i_fabricantes and EXISTS(SELECT * FROM item as i INNER JOIN VENDA ON(venda.i_vendas = i.i_vendas) WHERE i.i_produtos = NEW.i_produtos)"
Não conheço o teu modelo de dados para além do que esta no teu primeiro post. A minha resposta foi para te orientar em como se cria um trigger. Agora é adaptar para o teu modelo de dados.
Pelo que vejo do teu primeiro post deve ser algo parecido com
SELECT * FROM item as i
INNER JOIN VENDA ON(venda.i_vendas = i.i_vendas)
INNER JOIN produto p on i.i_produtos = p.i_produtos
WHERE i.i_fabricantes = NEW.i_fabricantes