触发器以从 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 更新,处理依赖关系的存储过程可能是实现目标的更明显且更易于维护的方法。
我正在尝试在 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 更新,处理依赖关系的存储过程可能是实现目标的更明显且更易于维护的方法。