2016-12-19 71 views
0

我試圖設置數據庫觸發器來記錄一些更改信息。我想要實現的是每當我的表的值被更新時,用戶名和日期也被保存。我想以此觸發這一點。如何在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; 

我已經來回用這個SAP help頁CREATE TRIGGER。但上面貼出的代碼不起作用。這還給了以下內容:

sql syntax error: incorrect syntax near "EXCEPT"

所以我使用了AFTER UPDATE觸發器,但我需要除了在我更新不進入無限循環的觸發器中的字段。所有的幫助都是有好處的。

回答

1

語法錯誤很可能是由於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行用例中,並不意味着它是一個好主意。不是。

+0

謝謝拉爾斯, 至於語法錯誤,我確實還在SPS10上。我完全錯過了幫助文件在HANA2上。感謝您指出了這一點。 我同意你總結的觀點,並會看看** audit **。非常感謝, - 馬特 –

相關問題