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
)

Online example

其中一个语法错误是嵌套 Select 语句

中的分号 ;

我想补充一点,在创建触发器函数时导致错误,在 pgAdmin 4 中,您将不得不打开一个新的查询工具并执行触发器函数脚本,而不是直接从 pgAdmin 创建触发器函数4 UI.

这解决了我的问题。