OrientDB-후크
OrientDB Hooks사용자 애플리케이션의 각 CRUD 작업 전후에 내부 이벤트를 활성화하는 데이터베이스 용어의 트리거 일뿐입니다. 후크를 사용하여 사용자 지정 유효성 검사 규칙을 작성하거나 보안을 강화하거나 관계형 DBMS에 대한 복제와 같은 외부 이벤트를 정렬 할 수 있습니다.
OrientDB는 두 종류의 후크를 지원합니다.
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에서 지원하는 모든 언어로 작성된 함수.
자바 정적 메서드.
클래스 레벨 후크
클래스 레벨 후크는 클래스와 관련된 모든 문서에 대해 정의됩니다. 다음은 송장 문서에 대해 클래스 수준에서 작동하는 후크를 설정하는 예입니다.
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
문서 레벨 후크
하나 이상의 문서에 대해서만 특수 조치를 정의 할 수 있습니다. 이렇게하려면 클래스가OTriggered 수업.
예를 들어 속성 계정이 'Premium'인 모든 문서에 대해 기존 프로필 클래스에 대해 Javascript 함수로 트리거를 실행 해 보겠습니다. 문서 삭제를 방지하기 위해 트리거가 호출됩니다.
ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile
SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'
만들자 preventDeletion() 자바 스크립트 기능.
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 후크 (트리거)의 일반적인 사용 사례 중 하나는 모든 클래스의 생성 및 업데이트 날짜를 관리하는 것입니다. 예를 들어,CreatedDate 레코드가 생성 될 때마다 필드를 만들고 UpdatedDate 레코드가 업데이트 될 때마다 필드를 작성하고 데이터베이스 계층에서 논리를 한 번 구현하고 애플리케이션 계층에서 다시는 걱정할 필요가없는 방식으로 수행합니다.
만들기 전에 다운로드해야합니다. orientdb-core.jar다음 링크를 방문하여 파일 다운로드 OrientDB core . 나중에 해당 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;
}
}
위의 샘플 코드는 해당 클래스의 레코드를 만들거나 업데이트 할 때마다 적절한 주석을 인쇄합니다.
후크 파일을 하나 더 추가하겠습니다. 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 코드를 컴파일하십시오. Note: 다운로드 한 jar 파일과 이러한 Java 파일을 동일한 폴더에 보관합니다.
$ jar cf hooks-1.0-SNAPSHOT.jar *.java
컴파일 된 코드를 OrientDB 서버가 찾을 수있는 곳으로 이동
완성 된 .jar 파일을 OrientDB 서버가 찾을 디렉토리에 복사해야합니다. 이것은 './lib'OrientDB Server 루트 디렉토리 아래의 폴더는 다음과 같습니다.
$ 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 Server를 다시 시작하면 정의한 후크 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 Hooks는 애플리케이션 코드에서 수행해야하는 작업을 자동화하는 데 매우 유용한 도구가 될 수 있습니다. 많은 DBA가 항상 Java 전문가는 아니기 때문에이 튜토리얼에 포함 된 정보가 도움이되고 기술에 익숙해 지므로 필요에 따라 데이터베이스 트리거를 성공적으로 만들 수 있습니다.