version 1

问题描述 投票:0回答:1

我使用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_idi.e 下面的数据是有效的,因为 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的ON BEFORE INSERT或UPDATE。

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
^

我是不是犯了什么语法错误?另外,上面的触发功能是否能满足我的要求?

先谢谢你!

postgresql plpgsql database-trigger
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.