GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Não permitir update se a tabela pai tiver alguma filha linkada [SQL]

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.

Essas são as tables:

Aqui o que tentei, mas não foi:

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;

PS: Foi feito para o postgres;

Agradeço desde já

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

Ok, vou ver e qualquer coisa eu tento arrumar/adaptar, caso contrário te retorno.
Mas obrigado, ficou mais claro

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
//