Синтаксис Teradata Trigger (ссылка на похожие строки для условной вставки) - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть TeraData таблица, которая выглядит примерно так:

Name;Year;Amount
1. Bob;2018;20
2. Bob;2022;14
3. Joe;2019;40
4. Ben;2017;12

PK это Name и Year. У меня есть триггер, который не позволяет пользователю редактировать строку Year на меньшее число. то есть изменение строки 3 с 2019 на 2018.

Этот триггер ниже:

Replace TRIGGER xyz.Month_Update
AFTER UPDATE OF Month ON xyz.table
REFERENCING OLD ROW as OldRow NEW ROW  as NewRow
 FOR EACH ROW
  WHEN NewRow.Year < OldRow.Year
abort;

Теперь я хотел бы сделать что-то подобное для вставки. Я хотел бы запретить пользователю вставлять новую строку в таблицу если ..

  1. В таблице уже существует строка для одного и того же человека и
  2. Этот ряд (ы) имеет больший год, чем тот, который пользователь пытается ввести

т.е. Пользователь не может ввести Joe;2017;19, но пользователь может ввести Joe;2020;19

Есть несколько очевидных проблем с триггером ниже, но он показывает общую идею:

Replace TRIGGER xyz.Month_Update
AFTER INSERT ON xyz.table
REFERENCING NEW ROW  as NewRow
 FOR EACH ROW
  WHEN NewRow.Year < (select max(year) from xyz.table as t1 where t1.name = NewRow.name group by t1.name)
abort;

Я новичок в триггерах в целом, и документация по teradata кажется пористой. Любые предложения приветствуются.

1 Ответ

0 голосов
/ 07 ноября 2018

Я точно не знаю, разрешен ли подобный коррелированный подзапрос в триггере (и как правильно его написать), но вы можете использовать макросы или хранимые процедуры в триггере:

REPLACE MACRO xyz.Month_Insert_macro(yr INT, name VARCHAR(50)) AS
( ABORT 'Greater year already exists for that name'
  WHERE :yr <
    ( SELECT Max(yr) FROM xyz.table
      WHERE name= :name
    );
);

Replace TRIGGER xyz.Month_Insert
-- it's better to abort BEFORE the Insert than AFTER (same for your Update Trigger)
BEFORE INSERT ON xyz.table
REFERENCING NEW ROW as NewRow
FOR EACH ROW
   EXEC xyz.Month_Insert_macro(NewRow.yr, NewRow.name);
...