触发器以从 table SAP HANA 更新特定行

Trigger to update specific row from table SAP HANA

我正在尝试在 Hana Studio 上创建一个触发器,以在 table [中发生更新时更新给定注册表(table "T2" 中的 "F2" 列)"T1"。 来自 "T1" 的行在 table "T2" 中引用了字段 "X1"(即,T1 中的 X1 等于 T2 中的 X2)。

我想做的是从 table "T1"(即正在更新的 table)中获取字段 "X1" 的值并使用它作为一个 where 子句来知道应该在 table "T2" 上更新哪一行。

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

create trigger TRIGGERNAME
after update on "SCHEMANAME.T1" for each row
begin
update "SCHEMANAME.T2" 
set F2 = "MY NEW VALUE" 
where X2 = X1
end;

问题是 X1 是我更新行中的一个字段。有没有办法从我的触发器上的更新行访问数据?

您正在查找 REFERENCING new row as ... | old row as ... 子句。 有关详细信息,请参阅 reference documentation.

一个简单的例子:

Table 设置

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       
*/    

虽然使用触发器通常看起来像是一种好方法,但我建议重新考虑它的用途,以及是否没有更好的方法来处理这些要求。触发器本身总是将 "magic" 引入数据模型,因为它们改变了普通语句的语义——你的 UPDATE 突然更新了多个 tables——对数据库用户来说并不明显。 事实上,只有积极寻找触发器,才有可能了解它们对数据库的影响 'behaves'。

对于多 table 更新,处理依赖关系的存储过程可能是实现目标的更明显且更易于维护的方法。