orientdb数据库-OrientDB钩子(触发器)

跨零代码为大家提供高品质的解决方案,请大家多多来访,跨零不胜感激,在此谢过。

OrientDB钩子类似于数据库术语中的触发器,它在用户应用程序中的每个CRUD操作之前和之后启用内部事件。可以使用挂钩编写自定义验证规则,强制执行安全性,或安排外部事件,例如针对关系DBMS进行复制。

OrientDB支持两种钩子 –

  • 动态钩子 – 触发器,可以在类级别和/或文档级别构建。
  • Java(Native)钩子 – 触发器,可以使用Java类构建。

动态钩子
动态钩子比Java钩子更灵活,因为它们可以在运行时更改,并且可以根据需要运行每个文档,但比Java钩子慢。

要对文档执行钩子,首先将类扩展OTriggered基类。 之后,为相应的事件定义一个自定义属性。 以下是可用的事件。

  • onBeforeCreate – 在创建新文档之前调用。
  • onAfterCreate – 创建新文档后调用。
  • onBeforeRead – 在读取文档之前调用。
  • onAfterRead – 读取文档后调用。
  • onBeforeUpdate – 在更新文档之前调用。
  • onAfterUpdate – 更新文档后调用。
  • onBeforeDelete – 在删除文档之前调用。
  • onAfterDelete – 删除文档后调用。

动态挂钩可以调用 –

  • 函数,SQL中,Javascript或OrientDB和JVM支持的任何语言编写。
  • Java静态方法。

类级别钩子

为与类相关的所有文档定义类级别钩子。 以下是一个示例,用于设置一个针对文档的类级别的钩子。

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

在Javascript中创建函数invoiceCreated,在服务器控制台中打印创建的票据编号。

CREATE FUNCTION invoiceCreated "print('//nInvoice created: ' + doc.field ('number'));" LANGUAGE Javascript 

现在通过创建一个新的票据文档来尝试钩子。

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

如果此命令成功执行,您将获得以下输出。

Invoice created: 100 

文档级别钩子

只能针对一个或多个文档定义特殊操作。 要做到这一点,创建的类需要扩展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 

然后通过尝试删除“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(触发器)的一个常见用例是管理任何或所有类的创建和更新日期。 例如,无论何时创建一条记录,都可以设置一个CreatedDate字段,并且每当记录更新时设置一个UpdatedDate字段,并以您在数据库层实现逻辑一次的方式执行,而不必再次担心应用程序层。

创建完成后,您需要通过访问以下链接下载OrientDB核心来orientdb-core.jar文件。 然后将该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'开头的类,并在创建记录时设置CreatedDateUpdatedDate,并在每次记录更新时设置UpdatedDate

编译Java钩子

使用以下命令编译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并在文件末尾添加以下部分。

<orient-server>  <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服务器配置文件中启用Real Hook
编辑$ORIENTDB_HOME/config/orientdb-server-config.xml 并按如下方式更改钩子部分 –

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

重新启动OrientDB服务器

创建一个以字母rt开头的新类 –

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  ----+-----+------+----+-----------+----------- 

即使您没有指定为CreatedDateUpdatedDate设置值,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 Hooks可以是一个非常有用的工具,可以帮助自动化工作,否则在应用程序代码中执行这些工作。 由于许多DBA并不总是Java专家,所以希望本教程中包含的信息能够让您领先一步,让您对该技术感到满意,从而使您能够在需要时成功创建数据库触发器。

  

从零到一,创造未来!跨零综合IT问题解决服务站,欢迎你的到来。Oracle数据库教程 orientdb数据库/a> 只为你绽放。

本文固定链接: http://kua0.com/2019/05/09/orientdb数据库-orientdb钩子(触发器)/

为您推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注