Синтаксическая ошибка в Postgres SQL при создании триггера для функции, которую я определил?

#sql #postgresql #function #triggers

#sql #postgresql #функция #триггеры

Вопрос:

Используя этот SQL:

 DROP FUNCTION IF EXISTS notify_new_proposed_game();
CREATE FUNCTION notify_new_proposed_game()
RETURNS void
AS 'NOTIFY proposed_game, ''new'';'
LANGUAGE SQL;

DROP TRIGGER IF EXISTS new_proposed_game ON game;
CREATE TRIGGER new_proposed_game
AFTER INSERT
ON game
EXECUTE FUNCTION notify_new_proposed_game();
  

Я получаю эту ошибку:

 DROP FUNCTION
CREATE FUNCTION
psql:schema.sql:27: NOTICE:  trigger "new_proposed_game" for relation "game" does not exist, skipping
DROP TRIGGER
psql:schema.sql:31: ERROR:  syntax error at or near "FUNCTION"
LINE 4: EXECUTE FUNCTION notify_new_proposed_game();
  

и я не уверен, почему.

Я между новичком и промежуточным с SQL, так что это вполне может быть что-то действительно простое.

Функция работает при вызове вручную в PSQL.

Желаемый результат:

  • ошибки нет
  • триггер настроен

Ответ №1:

Существует несколько проблем:

  1. Синтаксис: вы, должно быть, используете старую версию PostgreSQL, которую вы не можете использовать EXECUTE FUNCTION , но только EXECUTE PROCEDURE в CREATE TRIGGER инструкции.

  2. Функции триггера не могут быть написаны на SQL. Вы должны использовать PL / pgSQL или какой-либо другой процедурный язык.

  3. Ваша функция запуска должна RETURNS trigger , не void . Убедитесь, что RETURN NEW; в функции.

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

1. Спасибо за быстрый ответ! Я использую версию 12.4, и документы предполагают, EXECUTE PROCEDURE что она устарела? 2 и 3 имеют большой смысл, и я собираюсь попробовать их 🙂

2. Вы также забыли FOR EACH ROW .