
- OrientDB 教程
- OrientDB - 首頁
- OrientDB - 概述
- OrientDB - 安裝
- OrientDB - 基本概念
- OrientDB - 資料型別
- OrientDB - 控制檯模式
- OrientDB 資料庫命令
- OrientDB - 建立資料庫
- OrientDB - 修改資料庫
- OrientDB - 備份資料庫
- OrientDB - 恢復資料庫
- OrientDB - 連線資料庫
- OrientDB - 斷開資料庫連線
- OrientDB - 資料庫資訊
- OrientDB - 列出資料庫
- OrientDB - 凍結資料庫
- OrientDB - 釋放資料庫
- OrientDB - 配置資料庫
- OrientDB - 匯出資料庫
- OrientDB - 匯入資料庫
- OrientDB - 提交資料庫
- OrientDB - 回滾資料庫
- OrientDB - 最佳化資料庫
- OrientDB - 刪除資料庫
- OrientDB 記錄命令
- OrientDB - 插入記錄
- OrientDB - 顯示記錄
- OrientDB - 載入記錄
- OrientDB - 重新載入記錄
- OrientDB - 匯出記錄
- OrientDB - 更新記錄
- OrientDB - 清空記錄
- OrientDB - 刪除記錄
- OrientDB 類命令
- OrientDB - 建立類
- OrientDB - 修改類
- OrientDB - 清空類
- OrientDB - 刪除類
- OrientDB 叢集命令
- OrientDB - 建立叢集
- OrientDB - 修改叢集
- OrientDB - 清空叢集
- OrientDB - 刪除叢集
- OrientDB 屬性命令
- OrientDB - 建立屬性
- OrientDB - 修改屬性
- OrientDB - 刪除屬性
- OrientDB 頂點命令
- OrientDB - 建立頂點
- OrientDB - 移動頂點
- OrientDB - 刪除頂點
- OrientDB 邊命令
- OrientDB - 建立邊
- OrientDB - 更新邊
- OrientDB - 刪除邊
- OrientDB 高階概念
- OrientDB - 函式
- OrientDB - 序列
- OrientDB - 索引
- OrientDB - 事務
- OrientDB - 鉤子
- OrientDB - 快取
- OrientDB - 日誌
- OrientDB - 效能調優
- OrientDB - 升級
- OrientDB - 安全性
- OrientDB - Studio
- OrientDB 介面
- OrientDB - Java 介面
- OrientDB - Python 介面
- OrientDB 有用資源
- OrientDB - 快速指南
- OrientDB - 有用資源
- OrientDB - 討論
OrientDB - 鉤子
OrientDB 的鉤子在資料庫術語中就是觸發器,它可以在使用者應用程式中每個 CRUD 操作的前後觸發內部事件。您可以使用鉤子編寫自定義驗證規則,實施安全策略,或安排外部事件,例如與關係型資料庫管理系統進行復制。
OrientDB 支援兩種型別的鉤子:
動態鉤子 - 可以在類級別和/或文件級別構建的觸發器。
Java(原生)鉤子 - 使用 Java 類構建的觸發器。
動態鉤子
動態鉤子比 Java 鉤子更靈活,因為它們可以在執行時更改,並且可以根據需要在每個文件上執行,但速度比 Java 鉤子慢。
要對您的文件執行鉤子,首先允許您的類擴充套件OTriggered基類。之後,為感興趣的事件定義一個自定義屬性。以下是可用的事件。
onBeforeCreate - 在建立新文件之前呼叫。
onAfterCreate - 在建立新文件之後呼叫。
onBeforeRead - 在讀取文件之前呼叫。
onAfterRead - 在讀取文件之後呼叫。
onBeforeUpdate - 在更新文件之前呼叫。
onAfterUpdate - 在更新文件之後呼叫。
onBeforeDelete - 在刪除文件之前呼叫。
onAfterDelete - 在刪除文件之後呼叫。
動態鉤子可以呼叫:
用 SQL、Javascript 或 OrientDB 和 JVM 支援的任何語言編寫的函式。
Java 靜態方法。
類級別鉤子
類級別鉤子是為所有與某個類相關的文件定義的。以下是一個設定在類級別針對 Invoice 文件執行鉤子的示例。
CREATE CLASS Invoice EXTENDS OTriggered ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated
讓我們在 Javascript 中建立函式invoiceCreated,它在伺服器控制檯中列印建立的發票編號。
CREATE FUNCTION invoiceCreated "print('\\nInvoice created: ' + doc.field ('number'));" LANGUAGE Javascript
現在嘗試透過建立一個新的Invoice文件來使用此鉤子。
INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}
如果此命令成功執行,您將獲得以下輸出。
Invoice created: 100
文件級別鉤子
您可以僅針對一個或多個文件定義特定操作。為此,允許您的類擴充套件OTriggered類。
例如,讓我們針對現有的 Profile 類執行一個 Javascript 函式作為觸發器,該觸發器針對所有屬性 account = 'Premium' 的文件。該觸發器將被呼叫以阻止刪除文件。
ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'
讓我們建立preventDeletion() Javascript 函式。
CREATE FUNCTION preventDeletion "throw new java.lang.RuntimeException('Cannot delete Premium profile ' + doc)" LANGUAGE Javascript
然後透過嘗試刪除“Premium”賬戶來測試此鉤子。
DELETE FROM #12:1 java.lang.RuntimeException: Cannot delete Premium profile profile#12:1{onBeforeDelete:preventDeletion,account:Premium,name:Jill} v-1 (<Unknown source>#2) in <Unknown source> at line number 2
JAVA 鉤子
OrientDB 鉤子(觸發器)的一個常見用例是管理任何或所有類的建立日期和更新日期。例如,您可以在建立記錄時設定CreatedDate欄位,在更新記錄時設定UpdatedDate欄位,並且以一種方式實現邏輯,即在資料庫層實現一次,以後在應用程式層不再需要擔心它。
在建立之前,您需要透過訪問以下連結下載orientdb-core.jar檔案下載 OrientDB 核心。之後,將該 jar 檔案複製到您要儲存 Java 原始檔的資料夾中。
建立鉤子檔案
建立一個名為HookTest.java的 Java 檔案,它將使用 Java 語言測試鉤子機制。
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.ReentrantLock; import com.orientechnologies.orient.core.hook.ODocumentHookAbstract; import com.orientechnologies.orient.core.hook.ORecordHook; import com.orientechnologies.orient.core.hook.ORecordHookAbstract; import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener; import com.orientechnologies.orient.core.db.ODatabase; import com.orientechnologies.orient.core.record.ORecord; import com.orientechnologies.orient.core.record.impl.ODocument; public class HookTest extends ODocumentHookAbstract implements ORecordHook { public HookTest() { } @Override public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() { return DISTRIBUTED_EXECUTION_MODE.BOTH; } public RESULT onRecordBeforeCreate( ODocument iDocument ) { System.out.println("Ran create hook"); return ORecordHook.RESULT.RECORD_NOT_CHANGED; } public RESULT onRecordBeforeUpdate( ODocument iDocument ) { System.out.println("Ran update hook"); return ORecordHook.RESULT.RECORD_NOT_CHANGED; } }
上面的示例程式碼在每次建立或更新該類的記錄時列印相應的註釋。
讓我們再新增一個鉤子檔案setCreatedUpdatedDates.java,如下所示:
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.ReentrantLock; import com.orientechnologies.orient.core.hook.ODocumentHookAbstract; import com.orientechnologies.orient.core.hook.ORecordHook; import com.orientechnologies.orient.core.hook.ORecordHookAbstract; import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener; import com.orientechnologies.orient.core.db.ODatabase; import com.orientechnologies.orient.core.record.ORecord; import com.orientechnologies.orient.core.record.impl.ODocument; public class setCreatedUpdatedDates extends ODocumentHookAbstract implements ORecordHook { public setCreatedUpdatedDates() { } @Override public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() { return DISTRIBUTED_EXECUTION_MODE.BOTH; } public RESULT onRecordBeforeCreate( ODocument iDocument ) { if ((iDocument.getClassName().charAt(0) == 't') || (iDocument.getClassName().charAt(0)=='r')) { iDocument.field("CreatedDate", System.currentTimeMillis() / 1000l); iDocument.field("UpdatedDate", System.currentTimeMillis() / 1000l); return ORecordHook.RESULT.RECORD_CHANGED; } else { return ORecordHook.RESULT.RECORD_NOT_CHANGED; } } public RESULT onRecordBeforeUpdate( ODocument iDocument ) { if ((iDocument.getClassName().charAt(0) == 't') || (iDocument.getClassName().charAt(0)=='r')) { iDocument.field("UpdatedDate", System.currentTimeMillis() / 1000l); return ORecordHook.RESULT.RECORD_CHANGED; } else { return ORecordHook.RESULT.RECORD_NOT_CHANGED; } } }
上面程式碼的作用是查詢以字母“r”或“t”開頭的任何類,並在記錄建立時設定 CreatedDate 和 UpdatedDate,並在每次記錄更新時僅設定 UpdatedDate。
編譯 Java 鉤子
使用以下命令編譯 Java 程式碼。注意:將下載的 jar 檔案和這些 Java 檔案放在同一個資料夾中。
$ jar cf hooks-1.0-SNAPSHOT.jar *.java
將編譯後的程式碼移動到 OrientDB 伺服器可以找到的位置
您需要將生成的 .jar 檔案複製到 OrientDB 伺服器將查詢它們的目錄。這意味著 OrientDB 伺服器根目錄下的“./lib”資料夾將如下所示:
$ cp hooks-1.0-SNAPSHOT.jar "$ORIENTDB_HOME/lib"
在 OrientDB 伺服器配置檔案中啟用測試鉤子
編輯$ORIENTDB_HOME/config/orientdb-server-config.xml並在檔案末尾附近新增以下部分。
<hooks> <hook class = "HookTest" position = "REGULAR"/> </hooks> ... </orient-server>
重啟 OrientDB 伺服器
重新啟動 OrientDB 伺服器後,您在orientdb-server-config.xml中定義的鉤子現在處於活動狀態。啟動一個 OrientDB 控制檯,將其連線到您的資料庫,然後執行以下命令:
INSERT INTO V SET ID = 1;
如果此命令成功執行,您將獲得以下輸出。
Ran create hook
現在執行以下命令:
UPDATE V SET ID = 2 WHERE ID = 1;
如果此命令成功執行,您將獲得以下輸出。
Ran update hook
在 OrientDB 伺服器配置檔案中啟用真實鉤子
編輯$ORIENTDB_HOME/config/orientdb-server-config.xml並將 hooks 部分更改如下:
<hooks> <hook class="setCreatedUpdatedDates" position="REGULAR"/> </hooks> ... </orient-server>
重啟 OrientDB 伺服器
建立一個以字母“r”或“t”開頭的新的類:
CREATE CLASS tTest EXTENDS V;
現在插入一條記錄:
INSERT INTO tTest SET ID = 1 SELECT FROM tTest
如果此命令成功執行,您將獲得以下輸出。
----+-----+------+----+-----------+----------- # |@RID |@CLASS|ID |CreatedDate|UpdatedDate ----+-----+------+----+-----------+----------- 0 |#19:0|tTest |1 |1427597275 |1427597275 ----+-----+------+----+-----------+-----------
即使您沒有指定要為CreatedDate和UpdatedDate設定的值,OrientDB 也已自動為您設定了這些欄位。
接下來,您需要使用以下命令更新記錄:
UPDATE tTest SET ID = 2 WHERE ID = 1; SELECT FROM tTest;
如果此命令成功執行,您將獲得以下輸出。
----+-----+------+----+-----------+----------- # |@RID |@CLASS|ID |CreatedDate|UpdatedDate ----+-----+------+----+-----------+----------- 0 |#19:0|tTest |2 |1427597275 |1427597306 ----+-----+------+----+-----------+-----------
您可以看到 OrientDB 已更改了UpdatedDate,但保持CreatedDate不變。
OrientDB Java 鉤子可以成為一個非常有價值的工具,有助於自動化您原本必須在應用程式程式碼中執行的工作。由於許多 DBA 並不總是 Java 專家,希望本教程中包含的資訊能夠讓您有一個良好的開端,並讓您對該技術感到滿意,從而使您能夠在需要時成功建立資料庫觸發器。