用于更新表SAP HANA中特定行的触发器

用于更新表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是我更新的行中的一个字段。有没有办法从我的触发器上更新的行访问数据?您正在查找引用新行为…|的旧行为…子句。

我试图在Hana Studio上创建一个触发器,以便在表“T1”中发生更新时更新给定的注册表(表“T2”中的列“F2”)。 “T1”中的一行在表“T2”中引用,字段为“X1”(即,T1中的X1等于T2中的X2)

我想做的是从表“T1”(即正在更新的表)的字段“X1”中获取值,并将其用作where子句,以知道表“T2”上的哪一行a应该更新

这是我的触发器(或我希望它执行的操作):


问题是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       
*/