繁体   English   中英

如何在SAP HANA上的数据库触发器中使用列列表

[英]How to use a column list in a database trigger on SAP HANA

我正在尝试设置数据库触发器以记录一些更改信息。 我想实现的是,每当更新表的值时,用户名和日期也会被保存。 我想抓住这一点。

到目前为止,我得到的是:

CREATE TRIGGER "MySchema"."updateTrigger"
AFTER UPDATE EXCEPT OF "ChangedBy", "ValidForm" ON "MySchema"."MySchema.database::model.MyTable"
REFERENCING NEW ROW mynewrow, OLD ROW myoldrow
FOR EACH ROW

BEGIN
    /* UPDATE status values in Request Table */
    UPDATE "MySchema"."MySchema.database::model.MyTable" 
        SET "ChangedBy" = CURRENT_USER, "ValidFrom" = CURRENT_TIMESTAMP
        WHERE "TableId"=:myoldrow.TableId;

我已经在CREATE TRIGGER中使用了此SAP帮助页面。 但是上面发布的代码不起作用。 它返回以下内容:

sql语法错误:“ EXCEPT”附近的语法不正确

因此,我使用的是AFTER UPDATE触发器,但我需要在触发器中更新的字段之外,否则就不会陷入无限循环。 所有的帮助都非常重要。

语法错误很可能是由于EXCEPT子句仅在HANA SPS12中进入命令的事实。 您正在运行SPS12或更高版本吗?

无论如何,您采用的方法在很多层面上都不是很好,而且旧的ABAP数据建模仍然存在,并不能真正使它变得更好。

  1. 实际上,“ LAST_CHANGER”和“ LAST_CHANGED_DATE”不是用表建模的特定实体的一部分。 元数据应该保留在其他位置。

  2. 触发器是特定于平台的,因此您可以在HANA上将其设置为该代码将在其上运行的唯一平台。 但是,如果您已经在单个平台上,则最好使用适当的平台服务来进行此类更改跟踪。 在HANA中,它称为AUDIT ,它为这种手工触发方法提供了更加灵活和安全的方法。

  3. 触发因素过去,现在和将来都是管理和故障排除的噩梦。 在不知道要明确寻找它们的情况下,大多数时候它们在任何分析中都会被遗漏。 当他们在后台“神奇地”填充时,产生副作用的可能性就很高。

  4. 触发器也不会异步运行,因此对更新/插入性能也有很大影响。

  5. 使用触发器,您可以创建,维护和测试其他代码。 任何想法如何做到这一点? 提到的AUDIT功能现在需要额外的编码,无需维护和测试。 另外,对HANA系统数据(如user_name)的依赖关系会自动通过AUDIT功能进行管理。 您的触发代码不会。 考虑更改可能的用户名的长度(在早期的HANA版本中发生)。

知道所有这些论点都可能不会被注意,因为触发器对开发人员是如此吸引人,下面您将找到一个如何完成此操作的有效示例(在SPS12上,您只需在较早版本中就排除条款即可) ):

drop table mytab;
create column table mytab (id int, aaa nvarchar(20), bbb nvarchar(20), validfrom date, validto date,
                           last_changed timestamp, last_changer nvarchar(256));


create trigger update_trig 
before update except of validfrom, validto
on mytab
referencing new row newr 
for each row
begin
    newr.last_changed = current_utctimestamp;
    newr.last_changer = current_user;
end;

drop trigger insert_trig;
create trigger insert_trig 
before insert  
on mytab
referencing new row newr 
for each row
begin
    newr.last_changed = current_utctimestamp;
    newr.last_changer = current_user;
end;
truncate table mytab;

insert into mytab (id, aaa, bbb) values (1, 'bla', 'blupp');

select * from mytab;

/*
ID  AAA BBB     VALIDFROM   VALIDTO LAST_CHANGED            LAST_CHANGER
1   bla blupp   ?           ?       2016-12-19 23:10:46.866 DEVDUDE     
*/

update mytab set aaa='lala' where id = 1;

/*
ID  AAA     BBB     VALIDFROM   VALIDTO LAST_CHANGED            LAST_CHANGER
1   lala    blupp   ?           ?       2016-12-19 23:11:01.002 DEVDUDE     
*/

同样,仅因为它可以在A-line用例中编译和工作,并不意味着它是一个好主意。 不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM