Postgres Ошибка синтаксиса функции запуска около НАЧАЛА - PullRequest
0 голосов
/ 25 апреля 2020

Я использую 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 функциях триггера

Я создал следующую функцию триггера для проверки ON перед вставкой или обновлением 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
^

Я делаю какую-либо синтаксическую ошибку? Также будет ли работать вышеуказанная функция триггера нормально для моего требования?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Одной из синтаксических ошибок является точка с запятой ; во вложенном операторе Select

Я хотел бы добавить еще одну точку, которая вызвала ошибку при создании функции Trigger, в pgAdmin 4 вам придется откройте новый инструмент Query и выполните сценарий функции триггера вместо непосредственного создания функции Trigger из пользовательского интерфейса pgAdmin 4.

Это решило мою проблему.

0 голосов
/ 25 апреля 2020

Вам необходимо удалить ; из вашего вложенного выбора

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
)

Онлайн пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...