XQuery/使用觸發器記錄事件
外觀
< XQuery
您希望記錄單個集合中所有檔案的更改。
我們將建立一個觸發器來記錄這些事件。觸發器將一個字串追加到日誌檔案中。
有六種觸發器事件型別
- store: 當在集合或子集合中建立文件時觸發
- update: 當在集合或子集合中更新文件時觸發
- remove: 當從集合或子集合中刪除文件時觸發
- create: 當建立子集合時觸發
- rename: 當重新命名子集合時觸發
- delete: 當刪除子集合時觸發
注意:這些示例在 eXist 1.4 上不可靠!我還沒有在 2.0 上測試過。
在這個例子中,我們將記錄集合 /db/my-collection 中的所有 store、update 和 remove 事件。
這是一個示例觸發器配置檔案。此檔案放置在 /db/system/config 目錄下,並添加了要監控的相同 db 路徑。
/db/system/config/db/my-collection
以下是觸發器檔案的樣子
collection.xconf
<collection xmlns="http://exist-db.org/collection-config/1.0">
<triggers>
<trigger event="store, update, remove, create, rename, delete"
class="org.exist.collections.triggers.XQueryTrigger">
<parameter name="url"
value="xmldb:exist:///db/triggers/log-changes.xq"/>
<parameter name="test" value="test-value"/>
</trigger>
</triggers>
</collection>
注意,三個觸發器操作(store、update、remove)列在 event 屬性中,並用逗號分隔。當這些操作被觸發時,XQuery /db/triggers/log-changes.xq 將被執行。您可以使用 parameter 元素將引數傳遞給此查詢。
xquery version "1.0";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace response="http://exist-db.org/xquery/response";
declare namespace session="http://exist-db.org/xquery/session";
declare namespace xdb="http://exist-db.org/xquery/xmldb";
declare namespace util="http://exist-db.org/xquery/util";
declare variable $local:triggerEvent external;
declare variable $local:eventType external;
declare variable $local:collectionName external;
declare variable $local:documentName external;
declare variable $local:document external;
declare variable $local:test external;
declare variable $local:triggersLogFile := "triggersLog.xml";
(: create the log file if it does not exist :)
if(not(doc-available($local:triggersLogFile)))
then ( xmldb:store("/db", $local:triggersLogFile, <events/>) )
else(),
update
insert
<event ts="{ current-dateTime() }"
event="{$local:triggerEvent}"
eventType="{$local:eventType}"
test-1="{$local:test}"
collectionName="{$local:collectionName}"
documentName="{$local:documentName}" >
{$local:document}
</event>
into doc(concat("/db/", $local:triggersLogFile))/events