[RESOLVIDO]Trigger update estoque no Postgres

Olá pessoal, estou com uma tabela de empréstimos que remove a quantidade da tabela produtos fiz uma trigger pra INSERT, UPDATE E DELETE, estou testando o update só que não fez o que eu queria, estou aprendendo ainda a questão de trigger se alguem puder me orientar

O produto 1 tem 15 em estoque, se eu emprestar 5 ele debita os 5 e fica o 10 no estoque, só que se eu for alterar em vez de 5 pra 6 ele faz sobre o novo 10 e não sobre o antigo 15. até tentei colocar quantidade= old.quantidade - new.quantidade mas não foi.

CREATE TRIGGER t_emprestimos_estoque
AFTER INSERT OR UPDATE OR DELETE ON emprestimos
FOR EACH ROW
EXECUTE PROCEDURE emprestimos_estoque();


CREATE OR REPLACE FUNCTION emprestimos_estoque() RETURNS trigger
AS
$$
BEGIN
	IF(TG_OP = 'INSERT') THEN
		UPDATE produtos set quantidade = quantidade - NEW.quantidade
		WHERE codigo = NEW.produto; 
		RETURN NEW;
	ELSEIF(TG_OP = 'UPDATE') THEN
		UPDATE produtos set quantidade = quantidade - NEW.quantidade
		WHERE codigo = NEW.produto; 
		RETURN NEW;
	ELSEIF(TG_OP = 'DELETE') THEN
		UPDATE produtos set quantidade = quantidade + OLD.quantidade
		WHERE codigo = OLD.produto; 
		RETURN OLD;
	END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

[17:01, 20/10/2022] Emerson Brandão: a trigger vai atuar apenas na linha que entra ou sai, logo se vc precisar de estoque ‘anterior’ teria que ter isso preservado em mais de uma linha nao?
[17:01, 20/10/2022] Emerson Brandão: tipo um conta-corrente
[17:01, 20/10/2022] Emerson Brandão: o NEW ou OLD são apenas sobre 1 registro da transação, entao se precisar de algo ‘antigo’ terá que fazer algum SELECT do antes da alteração do registro para ver a contagem inicial

1 Curtida

Fiz o que você falou mas acabei resolvendo de outra forma
a tabela de movimentação estou tratando no scriptcase por enquanto

Resolvi da seguinte forma
Declarei uma variavel qtde valor 0 e fiz uma validação das quantidades pra saber quando eu podia remover e quando eu podia adicionar.

ELSEIF(TG_OP = ‘UPDATE’) THEN
IF(OLD.quantidade > NEW.quantidade) THEN
qtde := OLD.quantidade - new.quantidade;
UPDATE produtos set quantidade = quantidade - qtde
WHERE codigo = NEW.produto;
RETURN NEW;
ELSEIF(NEW.quantidade > OLD.quantidade) THEN
qtde := NEW.quantidade - OLD.quantidade;
UPDATE produtos SET quantidade = quantidade + qtde
WHERE codigo = NEW.produto;
RETURN NEW;
END IF;

essa ultima parte fiz pra outra trigger que eu precisava mas vai se aplicar de uma maneira inversa pro emprestimos