Estou tentando construir uma função de gatilho para atualizar automaticamente os valores do pedido pai sempre que qualquer um de seus itens for alterado.
Isto é o que eu criei:
CREATE OR REPLACE FUNCTION update_totals() RETURNS void AS $$
UPDATE orders SET
total_fees = (SELECT SUM(fees) FROM order_items WHERE order_id = OLD.order_id),
total_profit = (CASE WHEN total_cost IS NOT NULL THEN total - total_tax - total_cost - (SELECT SUM(fees) FROM order_items WHERE order_id = OLD.order_id) ELSE NULL END)
WHERE id = OLD.order_id;
$$
LANGUAGE SQL;
CREATE TRIGGER update_totals AFTER INSERT
OR UPDATE OF fees
ON order_items INITIALLY DEFERRED
FOR EACH ROW
WHEN ( OLD.* IS DISTINCT FROM NEW.* ) EXECUTE PROCEDURE update_totals();
Quando tento executar isso, recebo este erro:
missing FROM-clause for table "old"
Tentei criar uma referência para a tabela original na trigger:
CREATE TRIGGER update_totals AFTER INSERT
OR UPDATE OF fees
ON order_items
REFERENCING OLD ROW AS old_order
DEFERRABLE INITIALLY DEFERRED
FOR EACH ROW
WHEN ( OLD.* IS DISTINCT FROM NEW.* ) EXECUTE PROCEDURE update_totals();
Mas isso só dá o erro syntax error at or near "REFERENCING"
.
Como faço para obter o da tabela order_id
original ?order_items
Em primeiro lugar , para criar um gatilho na
order_items
tabela,update_totals()
deve ser uma função de gatilho queRETURNS TRIGGER
( negrito é meu).Se não, causa um erro
ERROR: function func_order_items must return type trigger
.Em segundo lugar , lembre-se de que você não pode ter
OLD
quando estiverAFTER INSERT
no gatilho. Se não, ele gera um erroERROR: record "old" is not assigned yet
.Por fim , dê uma olhada no exemplo abaixo: