【问题标题】:Trigger to update specific row from table SAP HANA触发以更新表 SAP HANA 中的特定行
【发布时间】:2019-02-16 07:12:39
【问题描述】:

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

我想要做的是从表“T1”(即正在更新的表)中获取字段“X1”的值,并将其用作 where 子句来知道应该在表上更新哪一行“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 是我更新行中的一个字段。有没有办法从我的触发器上的更新行访问数据?

【问题讨论】:

    标签: sap hana hana-studio


    【解决方案1】:

    您正在寻找REFERENCING new row as ... | old row as ... 子句。 详情请见reference documentation

    一个简单的例子:

    表设置

    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 突然更新了多个表——对数据库用户来说并不明显。 事实上,只有积极寻找触发器,才有可能了解它们对数据库“行为”方式的影响。

    对于多表更新,处理依赖关系的存储过程可能是实现目标的更明显和更好维护的方式。

    【讨论】:

    • 似乎是正确的道路,但我还有一个疑问。我希望触发器仅在表 ONE 中的给定列更新时触发,而不仅仅是表 ONE 上的任何更新。是否可以在“更新后”声明中设置特定列?例如,如果我只关心表 ONE 上的 F2 列更新,是否可以将语句设置为“在“ONE”更新后。“F2”?
    • 是的,链接文档显示了如何将触发操作限制到特定列或排除特定列。如果您使用此附加要求更新问题,那么我将相应地更新答案。
    • 我相信您回答了我提出的问题。谢谢你。由于我的疑问与我所问的不同,所以我问了一个不同的问题。 stackoverflow.com/questions/52297810/…感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多