OrientDB-フック

OrientDB Hooksユーザーアプリケーションの各CRUD操作の前後に内部イベントを有効にするデータベース用語のトリガーに他なりません。フックを使用して、カスタム検証ルールを記述したり、セキュリティを強化したり、リレーショナルDBMSに対する複製などの外部イベントを調整したりできます。

OrientDBは2種類のフックをサポートしています-

Dynamic Hook −トリガー。クラスレベルやドキュメントレベルで作成できます。

Java (Native) Hook −Javaクラスを使用して構築できるトリガー。

ダイナミックフック

動的フックは、実行時に変更でき、必要に応じてドキュメントごとに実行できるため、Javaフックよりも柔軟性がありますが、Javaフックよりも低速です。

ドキュメントに対してフックを実行するには、最初にクラスの拡張を許可します OTriggered基本クラス。後で、関心のあるイベントのカスタムプロパティを定義します。利用可能なイベントは次のとおりです。

  • onBeforeCreate −呼び出された before 新しいドキュメントを作成します。

  • onAfterCreate −呼び出された after 新しいドキュメントを作成します。

  • onBeforeRead −呼び出された before 文書を読む。

  • onAfterRead −呼び出された after 文書を読む。

  • onBeforeUpdate −呼び出された before ドキュメントの更新。

  • onAfterUpdate −呼び出された after ドキュメントの更新。

  • onBeforeDelete −呼び出された before ドキュメントを削除します。

  • onAfterDelete −呼び出された after ドキュメントを削除します。

ダイナミックフックは-を呼び出すことができます

  • SQL、Javascript、またはOrientDBとJVMでサポートされている任意の言語で記述された関数。

  • Java静的メソッド。

クラスレベルのフック

クラスレベルのフックは、クラスに関連するすべてのドキュメントに対して定義されています。以下は、請求書ドキュメントに対してクラスレベルで機能するフックを設定する例です。

CREATE CLASS Invoice EXTENDS OTriggered 
ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated

関数を作成しましょう invoiceCreated 作成された請求書番号をサーバーコンソールに出力するJavascriptで。

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

ドキュメントレベルフック

特別なアクションは、1つ以上のドキュメントに対してのみ定義できます。これを行うには、クラスを拡張できるようにしますOTriggered クラス。

たとえば、プロパティaccount = 'Premium'を持つすべてのドキュメントに対して、既存のProfileクラスに対してJavascript関数としてトリガーを実行してみましょう。ドキュメントの削除を防ぐためにトリガーが呼び出されます。

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

次に、「プレミアム」アカウントを削除してフックをテストします。

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フック(トリガー)の一般的な使用例の1つは、一部またはすべてのクラスの作成日と更新日を管理することです。たとえば、次のように設定できます。CreatedDate レコードが作成され、設定されるたびにフィールド UpdatedDate レコードが更新されるたびにフィールドを作成し、データベース層でロジックを一度実装し、アプリケーション層で再度心配する必要がないようにします。

作成する前に、ダウンロードする必要があります orientdb-core.jar次のリンクにアクセスしてファイルをダウンロードします。OrientDBコアをダウンロードします。その後、そのjarファイルをJavaソースファイルを保存するフォルダにコピーします。

フックファイルを作成する

名前の付いたJavaファイルを作成します HookTest.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;  
   }  
}

上記のサンプルコードは、そのクラスのレコードを作成または更新するたびに適切なコメントを出力します。

もう1つフックファイルを追加しましょう 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コードをコンパイルします。 Note:ダウンロードしたjarファイルとこれらのJavaファイルを同じフォルダに保存します。

$ jar cf hooks-1.0-SNAPSHOT.jar *.java

コンパイルされたコードをOrientDBサーバーが見つけられる場所に移動する

完成した.jarファイルをOrientDBサーバーが検索するディレクトリにコピーする必要があります。これは 'を意味します./lib'OrientDBサーバーのルートディレクトリの下にあるフォルダは次のようになります-

$ 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> 
      <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の専門家ではないため、このチュートリアルに含まれる情報が、必要に応じてデータベーストリガーを正常に作成できるように、有利なスタートを切り、テクノロジに慣れることができれば幸いです。