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是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;
现在我想为插入做一些类似的事情。
我想阻止用户将新行插入 table
如果..
- table 和
中已经存在同一个人的一行
- 该行的年份大于用户尝试输入的年份
即用户不能输入 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);
我有一个 TeraData
table 看起来像这样:
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;
现在我想为插入做一些类似的事情。 我想阻止用户将新行插入 table 如果..
- table 和 中已经存在同一个人的一行
- 该行的年份大于用户尝试输入的年份
即用户不能输入 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);