синтаксическая ошибка на уровне или около «AS» при создании триггера в postgresql

#sql #postgresql #triggers

#sql #postgresql #триггеры

Вопрос:

Добрый день,

У меня возникли проблемы с моим запросом, так как я не могу понять, почему я продолжаю получать ошибку «синтаксическая ошибка на уровне или около»КАК » вот мой запрос:

     CREATE TRIGGER  updateAvailableQuantity
    AFTER INSERT ON sale_item FOR EACH ROW 
    AS $$
    BEGIN
        IF NEW.quantity > 0 THEN
        UPDATE products
        SET products.quantity_instock = products.quantity_instock - NEW.quantity WHERE barcode =  NEW.barcode;
        END IF;
    END;
    $$ LANGUAGE plpgsql;
  

ошибка, которую я продолжаю получать, это,

     ERROR:  syntax error at or near "AS"
    LINE 4: AS $$
            ^
    SQL state: 42601
    Character: 100
  

Ответ №1:

Вы не можете написать триггер в PostgreSQL таким образом. Здесь это двухэтапный процесс.

  1. Сначала создайте триггерную функцию:
 CREATE OR REPLACE FUNCTION updateAvailableQuantity()
RETURNS TRIGGER
AS
$$
BEGIN
    IF NEW.quantity > 0 THEN
    UPDATE products
    SET quantity_instock = quantity_instock - NEW.quantity WHERE products.barcode =  NEW.barcode;
    END IF;

RETURN NULL;
END;
$$ LANGUAGE plpgsql;
  
  1. Затем напишите триггер в своей таблице для вызова функции, как показано ниже:
 CREATE TRIGGER  trg_updateAvailableQuantity
AFTER INSERT ON sale_item 
FOR EACH ROW 
EXECUTE PROCEDURE updateAvailableQuantity();
  

Комментарии:

1. Спасибо! Наконец, это сработало. Я был в полной загадке, почему это не работает, и в mysql workbench все работает нормально.

Ответ №2:

У вас ошибка в вашем синтаксисе. Смотрите страницу документации на create trigger .

FOR EACH ROW невозможно перейти REFERENCING AS к оператору before.

В документации также есть множество примеров.