Триггеры в postgres - PullRequest
       2

Триггеры в postgres

2 голосов
/ 19 декабря 2011

Я написал простой триггер в PL / pgSQL для PostgreSQL, но он не работает, как я планировал. У меня два вопроса:

  1. Есть ли отладчик для функций PostgreSQL?
  2. Где я не прав? Мне нужно проверить idprod здесь.

* * 1010

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Ваш if (idprod > 0), вероятно, лучше записать как if idprod is not null, но idprod > 0 должен работать.

Я предполагаю, что ошибка именно здесь:

update warehouses set amount = whamount * new.amount;

У вас нет предложения WHERE в этом ОБНОВЛЕНИИ, поэтому вы будете изменять каждую строку в таблице. Вы можете использовать это вместо:

select amount into whamount from warehouses where product = idprod;
update warehouses set amount = whamount * new.amount where product = idprod;

или лучше, сделайте это с помощью одного ОБНОВЛЕНИЯ:

update warehouses set amount = amount * new.amount where product = idprod;

Если вы пойдете с последним, вам больше не понадобится whamount в вашем разделе DECLARE.

Кроме того, я думаю, вы могли бы заменить ваши первые два SELECT на один SELECT. Эти два:

SELECT PRODUCT INTO idsupp from SUPPLIERS where ID = NEW.SUPPLIER;
SELECT ID INTO idprod from PRODUCTS where ID = idsupp;

можно заменить просто так:

select p.id into idprod
from products p
join suppliers s on p.id = s.product
where s.id = new.supplier;

и тогда вам тоже не понадобится idsupp.

Что касается отладки, единственное, что я знаю, это отладка в стиле printf с помощью raise notice; например:

raise notice 'idprod is "%"', idprod;
0 голосов
/ 17 апреля 2013

Для отладки вы также можете сделать:

RAISE DEBUG 'some debug message and variable value: %', some_variable;

Затем вы можете установить уровень журнала для отладки, чтобы вывести отладку.Вы можете оставить эти операторы отладки так, чтобы, если вы будете проводить какое-то расследование в будущем, эти операторы отладки потенциально могли бы все еще быть полезными.

...