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

时间:2018-11-06 05:48:34

标签: sql subquery teradata database-trigger

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

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;

现在,我想对插入执行类似的操作。 我想防止用户将新行插入表中 如果..

  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 :(得分: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);