Teradata 触发器语法(为条件插入引用相似的行)

Teradata Trigger Syntax (referencing similar rows for conditional insert)

我有一个 TeraData table 看起来像这样:

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

PK是NameYear。我有一个触发器可以防止用户将行的 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;

现在我想为插入做一些类似的事情。 我想阻止用户将新行插入 table 如果..

  1. table 和
  2. 中已经存在同一个人的一行
  3. 该行的年份大于用户尝试输入的年份

即用户不能输入 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 文档看起来漏洞百出。非常感谢任何建议。

我不知道触发器中是否允许这样的相关子查询(以及如何正确编写),但您可以在触发器中使用宏或存储过程:

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);