PostgreSQL создать триггер: синтаксическая ошибка при действии вставки - PullRequest
0 голосов
/ 25 мая 2020

Я хочу создать триггер в PostgreSQL.

У меня есть таблица продуктов и таблица категорий. Если новый кортеж вставлен в таблицу продуктов с category_id, которого еще не существует, я хочу создать категорию с этим точным category_id. Я написал код SQL, но у меня появляется синтаксическая ошибка в строке «INSERT» в строке 6.

Мой код следующий:

CREATE TRIGGER ProductTrig
  AFTER INSERT ON products
  REFERENCING NEW ROW AS newrow
  FOR EACH ROW
  WHEN (newrow.category_id NOT IN (SELECT category_id FROM categories))
  INSERT INTO categories (category_id) VALUES (newrow.category_id);

Кто-нибудь видит проблему? Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Из документации для CREATE TRIGGER видно, что конец оператора должен быть EXECUTE PROCEDURE, за которым следует имя хранимой процедуры. В своем запросе вы указываете предложение INSERT, которое не соответствует этим требованиям.

Вам нужно будет поместить предложение INSERT в рамках хранимой процедуры, а затем обратиться к нему в конце вашего оператора CREATE TRIGGER. В этом вам может помочь документация для CREATE PROCEDURE .

0 голосов
/ 25 мая 2020

Как видно из документации , напишите функцию, которая будет запускаться после триггера.

Например:

CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
    [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )

where event can be one of:

    INSERT
    UPDATE [ OF column_name [, ... ] ]
    DELETE
    TRUNCATE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...