Перед вставкой триггер для замены новых данных postgres - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть таблица с двумя столбцами данных: col1 и col2.Col1 - это текстовое поле, а col2 - время.Col1 является обязательным, col2 - нет, поэтому значение по умолчанию должно быть равно нулю.Я использую pgAdmin, который является совершенно новым для меня, как триггер sql.У меня есть следующий код функции триггера:

CREATE OR REPLACE FUNCTION schema.table_replace()
  RETURNS trigger AS
  LANGUAGE 'plpgsql';
$BODY$
BEGIN
    (CASE
        WHEN NEW.col1='111' THEN NEW.col1='aaa'
        WHEN NEW.col1='222' THEN NEW.col1='bbb'
        WHEN NEW.col1='333' THEN NEW.col1='ccc'
        ELSE NEW.col1='error'
    END);
return NEW;
END;
$BODY$

И это может быть предыдущий триггер (должны быть затронуты только текущие значения, а не все строки):

CREATE TRIGGER schema.table_replace
  BEFORE INSERT
  ON schema.table
  EXECUTE PROCEDURE schema.table_replace();

Честно говоряЯ ничего не знаю о pgAdmin, кажется, что это намного сложнее, чем писать код и запускать его с помощью инструмента запросов.Проблема состоит в том, чтобы обработать случай, когда нет второго значения (это необязательно), и в этом случае столбец col2 строки следует оставить нетронутым, а код SQL также возвращает ошибки.Не могли бы вы помочь ему запустить и создать функцию и триггер?Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Основная проблема вашего примера - отсутствие выражения FOR EACH ROW в вашем выражении CREATE TRIGGER.Без этого условия созданный триггер является триггером оператора с другим поведением.Ваша задача может быть решена с помощью SQL-оператора CASE.

CREATE OR REPLACE FUNCTION schema.table_replace()
RETURNS trigger AS
LANGUAGE 'plpgsql';
$BODY$
BEGIN
  IF NEW.col2 NOT NULL THEN
    NEW.col1 := CASE NEW.col1
                     WHEN '111' THEN 'aaa'
                     WHEN '222' THEN 'bbb'
                     WHEN '333' THEN 'ccc'
                     ELSE 'error' END CASE;
  END IF;
  RETURN NEW;
END;
$BODY$
0 голосов
/ 30 декабря 2018

CASE как управляющая структура закрывается с END CASE (тогда как выражение закрывается только с END).А в ветках есть операторы, их нужно заканчивать точкой с запятой.

Ваш LANGUAGE также неуместен.Это принадлежит в конце.И вам не нужны одинарные кавычки.

Вы можете использовать IF только для замены, когда col2 не равно нулю.

CREATE OR REPLACE FUNCTION schema.table_replace()
                           RETURNS trigger AS
$BODY$
BEGIN
  IF NEW.col2 IS NOT NULL THEN
    CASE
      WHEN NEW.col1 = '111' THEN
        NEW.col1 = 'aaa';
      WHEN NEW.col1 = '222' THEN
        NEW.col1 = 'bbb';
      WHEN NEW.col1 = '333' THEN
        NEW.col1 = 'ccc';
      ELSE
        NEW.col1 = 'error';
    END CASE;
  END IF;

  RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

Вам также необходимообъявите триггер как FOR EACH ROW триггер для NEW для работы.

И имя триггера не может быть квалифицировано схемой.

CREATE TRIGGER table_replace
               BEFORE INSERT
               ON schema.table
               FOR EACH ROW
               EXECUTE PROCEDURE schema.table_replace();
...