首页 > 解决方案 > 为我定义的函数创建触发器时,Postgres SQL 中的语法错误?

问题描述

使用此 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 中手动调用时起作用。

期望的结果:

标签: sqlpostgresqlfunctiontriggers

解决方案


有几个问题:

  1. 语法:你必须使用旧版本的 PostgreSQL,你不能使用EXECUTE FUNCTION,但只能EXECUTE PROCEDURECREATE TRIGGER语句中使用。

  2. 触发器函数不能用 SQL 编写。您必须使用 PL/pgSQL 或其他一些过程语言。

  3. 你的触发函数必须RETURNS trigger,不是void。确保RETURN NEW;在函数中。


推荐阅读