#sql #postgresql #function #triggers
#sql #postgresql #функция #триггеры
Вопрос:
Я создал базу данных postgresql с помощью pgadmin.
Мне нужен триггер / функции, который обрабатывает новые покупки:
purchases_ait
срабатывает при добавлении в purchases
; проверяет запасы перед добавлением покупки в purchases
таблицу и выдает исключение, если их недостаточно; если исключения нет, вычитает количество проданных из inventory
и добавляет его в purchases
.
Purchases.ait
выдает сообщение об ошибке: more than one row is returned
. Пожалуйста, скажите мне, почему это происходит. Я думаю, что это может быть связано с логическим упорядочением, таким как операторы if / then и / или begin / end. Но я не смог разобраться в этом. Помощь высоко ценится!
Purchases_ait: (Исходный create function
код, код запуска)
CREATE FUNCTION purchases_ait()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
BEGIN
IF NEW.quantity > quantity
FROM public.inventory THEN
RAISE EXCEPTION 'We do not have that much of that item left.';
END IF;
UPDATE public.inventory
SET quantity = quantity - NEW.quantity
WHERE item_id = NEW.item_id;
RETURN NEW;
END;
$$
--trigger code --
CREATE TRIGGER purchases_ait
AFTER INSERT
ON public.purchases
FOR EACH ROW
EXECUTE PROCEDURE purchases_ait()
Комментарии:
1. Я не думаю, что триггер должен возвращать эту ошибку. Я привык получать эту ошибку, когда вложенный запрос возвращает несколько строк и используется при сравнении по порядку… вы уверены, что сообщение об ошибке действительно исходит от триггера, а не от другого оператора, который вы запускаете?
2. Пожалуйста, вставьте ваш код, который вызывает этот триггер.
3.
IF NEW.quantity > quantity FROM public.inventory
недопустимый PL / pgSQL — Я удивлен, что ваша триггерная функция вообще компилируется. Пожалуйста, опубликуйте полныйcreate function
код, соответствующиеcreate trigger
инструкции и инструкцию SQL, которая запускает триггер4. Вы пропустили,
WHERE
который вернул бы количествоNEW.item_id
и, следовательно, несколько строк.5. Кунал, я добавил свое предложение where
item_id = NEW.item_id;
к оператору IF в моей первой функции, но я все еще получаю то же сообщение об ошибке
Ответ №1:
У меня получилось. Две проблемы были:
- изменил его на
BEFORE
, а не наAFTER
функцию - изменил его на
FOR EACH STATEMENT
, а не наFOR EACH ROW
приложение