Синтаксис Teradata Trigger (ссылка на похожие строки для условной вставки)
У меня есть TeraData
таблица, которая выглядит примерно так:
Name;Year;Amount
1. Bob;2018;20
2. Bob;2022;14
3. Joe;2019;40
4. Ben;2017;12
ПК является 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;
Теперь я хотел бы сделать что-то подобное для вставки. Я хотел бы запретить пользователю вставлять новую строку в таблицу, если..
- Там уже существует строка для того же человека в таблице и
- Этот ряд (ы) имеет больший год, чем тот, который пытается ввести пользователь
т.е. пользователь не может войти 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 ответ
Я точно не знаю, разрешен ли подобный коррелированный подзапрос в триггере (и как правильно его написать), но вы можете использовать макросы или хранимые процедуры в триггере:
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);