OrientDB挂钩

2018-12-24 15:44 更新

OrientDBHooks只是数据库术语中的触发器,它们在用户应用程序中的每个CRUD操作之前和之后启用内部事件。您可以使用钩子编写自定义验证规则,强制实施安全性,或安排外部事件,例如根据关系型DBMS进行复制。

OrientDB支持两种钩子:

动态Hook-触发器,可以在类级别和/或文档级别构建。
Java(Native)Hook-触发器,可以使用Java类构建。
动态钩子
动态钩子比Java钩子更灵活,因为它们可以在运行时更改,并且如果需要可以运行每个文档,但是比Java钩子慢。
要对你的文档执行钩子,首先让你的类扩展TOTriggeredbase类。稍后,为感兴趣的事件定义自定义属性。以下是可用的事件。
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('
Invoice created: ' + doc.field ('number'));"
LANGUAGE Javascript

现在通过创建一个新的Invoice文档来尝试挂钩。

INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}

如果成功执行这个命令,你会得到下面的输出。

Invoice created: 100

文档级挂钩

只能针对一个或多个文档定义一个特殊操作。要做到这一点,让你的类来扩展OTriggered类。

例如,让我们执行一个触发,例如JavaScript功能,针对存在的Profile类,所有的财产账户='高级'的文件。触发器将被调用,以防止文件删除。

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 Hooks(触发器)的一个常见用例是管理任何或所有类的创建和更新日期。 例如,可以在创建记录时设置aCreatedDatefield,并在更新记录时设置anUpdatedDatefield,并在数据库层实现逻辑一次,而不必在应用程序层再次担心它。
在创建之前,您必须通过访问以下链接下载OrientDB核心:下载orientdb-core.jarfile。 然后将该jar文件复制到要存储Java源文件的文件夹中。
创建钩子文件
创建一个名为HookTest.java的Java文件,它将使用Java语言测试Hook机制。

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.xmland在文件末尾添加以下部分。

   <hooks> 
      <hook class = "HookTest" position = "REGULAR"/> 
   </hooks> 
   ... 
</orient-server>

重新启动OrientDB服务器
一旦您重新启动OrientDB服务器,您定义的钩子inorientdb-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服务器配置文件中启用Real Hook
编辑$ ORIENTDB_HOME / config / orientdb-server-config.xmland更改钩子部分如下:

   <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改变了UpUpdatedDate,但是让CreatedDateremain保持不变。
OrientDB Java Hooks可以是一个非常有价值的工具,帮助自动化您在应用程序代码中必须做的工作。 由于许多DBA并不总是Java专家,希望本教程中包含的信息将为您提供一个良好的开端,使您感到舒适的技术,使您能够根据需要成功创建数据库触发器。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号