用于更新表SAP HANA中特定行的触发器
我试图在Hana Studio上创建一个触发器,以便在表“T1”中发生更新时更新给定的注册表(表“T2”中的列“F2”)。 “T1”中的一行在表“T2”中引用,字段为“X1”(即,T1中的X1等于T2中的X2) 我想做的是从表“T1”(即正在更新的表)的字段“X1”中获取值,并将其用作where子句,以知道表“T2”上的哪一行a应该更新 这是我的触发器(或我希望它执行的操作):用于更新表SAP HANA中特定行的触发器,sap,hana,hana-studio,Sap,Hana,Hana Studio,我试图在Hana Studio上创建一个触发器,以便在表“T1”中发生更新时更新给定的注册表(表“T2”中的列“F2”)。 “T1”中的一行在表“T2”中引用,字段为“X1”(即,T1中的X1等于T2中的X2) 我想做的是从表“T1”(即正在更新的表)的字段“X1”中获取值,并将其用作where子句,以知道表“T2”上的哪一行a应该更新 这是我的触发器(或我希望它执行的操作): 问题是X1是我更新的行中的一个字段。有没有办法从我的触发器上更新的行访问数据?您正在查找引用新行为…|的旧行为…子句。
问题是X1是我更新的行中的一个字段。有没有办法从我的触发器上更新的行访问数据?您正在查找引用新行为…|的
旧行为…
子句。
有关详细信息,请参阅
一个简单的例子:
表格设置
create table one (ID int primary key, F2 nvarchar(100));
create table two (ID int primary key, F2 nvarchar(100));
insert into one values (1, 'Bla');
insert into one values (2, 'Blupp');
insert into two values (1, 'Bla');
insert into two values (2, 'Blupp');
创建触发器
create trigger "ONE_TO_TWO"
after update
on "ONE"
referencing new row as new, old row as old
for each row
begin
update "TWO" t
set "F2" = :new."F2"
where t."ID" = :old."ID";
end;
检查当前数据
select
one.id as ONE_ID, one.f2 as ONE_F2
, two.id as TWO_ID, two.f2 as TWO_F2
from
one full outer join two
on one.id = two.id;
/*
ONE_ID ONE_F2 TWO_ID TWO_F2
1 Bla 1 Bla
2 Blupp 2 Blupp
*/
更新记录并再次检查数据
update "ONE"
set "F2" = 'CHANGED THIS'
where "ID" = 1;
/*
ONE_ID ONE_F2 TWO_ID TWO_F2
1 CHANGED THIS 1 CHANGED THIS
2 Blupp 2 Blupp
*/
虽然使用触发器通常看起来是一种很好的方法,但我建议重新考虑它的用途,如果没有更好的方法来处理需求的话。触发器本身总是在数据模型中引入“魔力”,因为它们改变了正常语句的语义—您的UPDATE
突然更新了多个表—DB用户并不明显。
事实上,只有主动寻找触发器,才有可能理解它们对数据库“行为”的影响
对于多表更新,处理依赖关系的存储过程可能是实现目标的更明显、更易于维护的方法。似乎是正确的路径,但我还有一个疑问。我希望触发器仅在表1中的给定列更新时触发,而不仅仅是在表1上的任何更新时触发。是否可以在“一次更新后”语句中设置特定列?例如,如果我只关心表1上的F2列更新,是否可以将语句设置为“ONE”更新后的“F2”?是的,链接文档显示了如何将触发器操作限制到特定列或排除特定列。如果你用这个附加要求更新了问题,那么我会相应地更新答案。我相信你回答了我问的问题。非常感谢。因为我有不同于我所问的怀疑,我问了一个不同的问题。谢谢你抽出时间。
update "ONE"
set "F2" = 'CHANGED THIS'
where "ID" = 1;
/*
ONE_ID ONE_F2 TWO_ID TWO_F2
1 CHANGED THIS 1 CHANGED THIS
2 Blupp 2 Blupp
*/