#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:
Существует несколько проблем:
-
Синтаксис: вы, должно быть, используете старую версию PostgreSQL, которую вы не можете использовать
EXECUTE FUNCTION
, но толькоEXECUTE PROCEDURE
вCREATE TRIGGER
инструкции. -
Функции триггера не могут быть написаны на SQL. Вы должны использовать PL / pgSQL или какой-либо другой процедурный язык.
-
Ваша функция запуска должна
RETURNS trigger
, неvoid
. Убедитесь, чтоRETURN NEW;
в функции.
Комментарии:
1. Спасибо за быстрый ответ! Я использую версию 12.4, и документы предполагают,
EXECUTE PROCEDURE
что она устарела? 2 и 3 имеют большой смысл, и я собираюсь попробовать их 🙂2. Вы также забыли
FOR EACH ROW
.