BEGIN 附近的 Postgres 触发器函数语法错误
Postgres Trigger function syntax error near BEGIN
我使用 PostgreSQL 12
我有以下两个表:
table_a:
table_a_id | version
1 | v1
2 | v1
3 | v1
4 | v2
5 | v2
6 | v2
table_b:
table_b_id | version | table_a_id
1 | v1 | 1
2 | v1 | 2
3 | v1 | 3
4 | v2 | 4
5 | v2 | 5
6 | v2 | 6
table_b 必须引用相同的版本 table_a_id
即以下数据是有效条目,因为 table_a_id -> 1 属于版本 'v1'
table_b_id | version | table_a_id
1 | v1 | 1
但是下面的数据是无效条目因为table_a_id -> 4属于版本'v2'
table_b_id | version | table_a_id
1 | v1 | 4
我是 Postgres 触发器函数的新手
我创建了以下触发器函数来在插入或更新到 table_b 之前进行验证:
CREATE FUNCTION version_check()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF NOT EXISTS (
SELECT
*
FROM
"table_a"
WHERE
"table_a"."table_a_id" = NEW."table_a_id"
AND
"table_a"."version" = NEW."version";
)
THEN
RAISE EXCEPTION 'table_a and table_b Version do not match';
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER "version_check" BEFORE INSERT OR UPDATE ON "table_b"
FOR EACH ROW EXECUTE PROCEDURE version_check();
在 pgAdmin 4 中保存触发器函数时出现以下错误
ERROR: syntax error at or near "BEGIN"
LINE 8: BEGIN
^
我有语法错误吗?上面的触发功能也能满足我的要求吗?
提前致谢!
您需要删除嵌套 select
中的 ;
IF NOT EXISTS (
SELECT
*
FROM
"table_a"
WHERE
"table_a"."table_a_id" = NEW."table_a_id"
AND
"table_a"."version" = NEW."version" --<< no semicolon here
)
其中一个语法错误是嵌套 Select 语句
中的分号 ;
我想补充一点,在创建触发器函数时导致错误,在 pgAdmin 4 中,您将不得不打开一个新的查询工具并执行触发器函数脚本,而不是直接从 pgAdmin 创建触发器函数4 UI.
这解决了我的问题。
我使用 PostgreSQL 12
我有以下两个表:
table_a:
table_a_id | version
1 | v1
2 | v1
3 | v1
4 | v2
5 | v2
6 | v2
table_b:
table_b_id | version | table_a_id
1 | v1 | 1
2 | v1 | 2
3 | v1 | 3
4 | v2 | 4
5 | v2 | 5
6 | v2 | 6
table_b 必须引用相同的版本 table_a_id 即以下数据是有效条目,因为 table_a_id -> 1 属于版本 'v1'
table_b_id | version | table_a_id
1 | v1 | 1
但是下面的数据是无效条目因为table_a_id -> 4属于版本'v2'
table_b_id | version | table_a_id
1 | v1 | 4
我是 Postgres 触发器函数的新手
我创建了以下触发器函数来在插入或更新到 table_b 之前进行验证:
CREATE FUNCTION version_check()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF NOT EXISTS (
SELECT
*
FROM
"table_a"
WHERE
"table_a"."table_a_id" = NEW."table_a_id"
AND
"table_a"."version" = NEW."version";
)
THEN
RAISE EXCEPTION 'table_a and table_b Version do not match';
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER "version_check" BEFORE INSERT OR UPDATE ON "table_b"
FOR EACH ROW EXECUTE PROCEDURE version_check();
在 pgAdmin 4 中保存触发器函数时出现以下错误
ERROR: syntax error at or near "BEGIN"
LINE 8: BEGIN
^
我有语法错误吗?上面的触发功能也能满足我的要求吗?
提前致谢!
您需要删除嵌套 select
中的;
IF NOT EXISTS (
SELECT
*
FROM
"table_a"
WHERE
"table_a"."table_a_id" = NEW."table_a_id"
AND
"table_a"."version" = NEW."version" --<< no semicolon here
)
其中一个语法错误是嵌套 Select 语句
中的分号;
我想补充一点,在创建触发器函数时导致错误,在 pgAdmin 4 中,您将不得不打开一个新的查询工具并执行触发器函数脚本,而不是直接从 pgAdmin 创建触发器函数4 UI.
这解决了我的问题。