2016-02-26 44 views
0

長時間潛伏,但第一個問題。OrientDB通過觸發器自動記錄更新日誌

終於想通了如何保持通過觸發更新日誌在這個問題上 Embedding record from function in OrientDB 但我也想保持像這道具進行了更新,用戶更新記錄,也許其他元數據。

我的使用情況下,使用HTTP請求與命令的JSON數組傳遞upserts的批次從C#,到一些基類,如下所示:

ALTER CLASS V SUPERCLASS +OTriggered 

CREATE CLASS ChangeHistory ABSTRACT 
CREATE PROPERTY ChangeHistory.user LINK 
CREATE PROPERTY ChangeHistory.changetype STRING 
CREATE PROPERTY ChangeHistory.timestamp DATETIME 
ALTER PROPERTY ChangeHistory.timestamp DEFAULT sysdate() 

CREATE PROPERTY V.changelog EMBEDDEDLIST ChangeHistory 
ALTER PROPERTY V.changelog DEFAULT {「changetype」:」initial creation」} 
ALTER CLASS V CUSTOM onAfterUpdate=recordUpdated 

是否有任何方式訪問觸發器數據?是否有任何使用風險

orient.getGraphNoTx() 

在此先感謝!

編輯

我想通了,如何保持使用該策略在我的答案非常健壯的更新日誌,但我還是不上,我似乎必須使用getGraphNoTx()的含義完全清楚。動態鉤子在包含更新的事務中觸發嗎?

回答

1

好吧,我已經進一步了,並且認爲我會張貼以防其他人想要達到相同的效果。

1)拖欠更改日誌「記錄創建」

這是可能的,我只是缺少你需要@class和@type違約,但只有相關領域的補充。 新線:

ALTER PROPERTY E.changelog DEFAULT [{'@type':'d','@class':'ChangeHistory', 'changetype':'initial creation'}]; 

2)誘捕更新用戶和更新的領域

解決了這一個了,加入了無架構道具的更新記錄,從JS函數對象得到它

doc.field("updater") 

並在刪除記錄級別的prop之前將其傳遞給changelog。如果您只傳入正在更新的字段,這也適用於更新的字段。全功能的創建SQL低於(更新只,而不是更新的字段)

CREATE FUNCTION recordUpdated " 
var graph = orient.getGraphNoTx(); 
var updater = graph.command('sql', 'SELECT FROM OUser WHERE name = \"' + doc.field('updater') + '\"'); 
graph.command('sql', 'UPDATE ' + doc.field('@rid') + ' ADD changelog = [{\"user\":\"' + updater[0].getId() + '\", \"changetype\":\"Update\"}]'); 
graph.command('sql', 'UPDATE ' + doc.field('@class') + ' REMOVE updater WHERE @rid = \"' + doc.field('@rid') + '\"'); 
" LANGUAGE JAVASCRIPT; 

3)getGraphNoTx()

我找不到getGraphNoTx()是安全的證明,但我的理解是,它只是阻止函數本身作爲事務運行。最糟糕的情況似乎是更改日誌條目接收到錯誤的更新程序?