我有一个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;
现在,我想对插入执行类似的操作。 我想防止用户将新行插入表中 如果..
即用户无法输入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文档似乎是多孔的。.任何建议都将不胜感激。
答案 0 :(得分: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);