OrientDB - Ganchos
OrientDB Hooksnada mais são do que gatilhos na terminologia do banco de dados que permitem eventos internos antes e depois de cada operação CRUD nos aplicativos do usuário. Você pode usar ganchos para escrever regras de validação personalizadas, para impor a segurança ou para organizar eventos externos, como a replicação em um DBMS relacional.
OrientDB suporta dois tipos de ganchos -
Dynamic Hook - Triggers, que podem ser construídos em nível de classe e / ou nível de documento.
Java (Native) Hook - Triggers, que podem ser construídos usando classes Java.
Ganchos Dinâmicos
Os ganchos dinâmicos são mais flexíveis do que os ganchos Java, porque podem ser alterados no tempo de execução e podem ser executados por documento, se necessário, mas são mais lentos do que os ganchos Java.
Para executar ganchos em seus documentos, primeiro permita que suas classes estendam OTriggeredclasse base. Posteriormente, defina uma propriedade customizada para o evento de interesse. A seguir estão os eventos disponíveis.
onBeforeCreate - Chamado before criando um novo documento.
onAfterCreate - Chamado after criando um novo documento.
onBeforeRead - Chamado before lendo um documento.
onAfterRead - Chamado after lendo um documento.
onBeforeUpdate - Chamado before atualizar um documento.
onAfterUpdate - Chamado after atualizar um documento.
onBeforeDelete - Chamado before excluir um documento.
onAfterDelete - Chamado after excluir um documento.
Ganchos dinâmicos podem chamar -
Funções, escritas em SQL, Javascript ou qualquer linguagem suportada por OrientDB e JVM.
Métodos estáticos Java.
Ganchos de nível de classe
Ganchos de nível de classe são definidos para todos os documentos relacionados a uma classe. A seguir está um exemplo para configurar um gancho que atua em nível de classe contra documentos de fatura.
CREATE CLASS Invoice EXTENDS OTriggered
ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated
Vamos criar a função invoiceCreated em Javascript que imprime no console do servidor o número da fatura criada.
CREATE FUNCTION invoiceCreated "print('\\nInvoice created: ' + doc.field ('number'));"
LANGUAGE Javascript
Agora tente o gancho criando um novo Invoice documento.
INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}
Se este comando for executado com sucesso, você obterá a seguinte saída.
Invoice created: 100
Gancho de nível de documento
Você pode definir uma ação especial apenas contra um ou mais documentos. Para fazer isso, permita que sua classe estendaOTriggered classe.
Por exemplo, vamos executar um gatilho, como função Javascript, contra uma classe de Perfil existente, para todos os documentos com conta de propriedade = 'Premium'. O gatilho será chamado para evitar a exclusão de documentos.
ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile
SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'
Vamos criar o preventDeletion() Função Javascript.
CREATE FUNCTION preventDeletion "throw new java.lang.RuntimeException('Cannot
delete Premium profile ' + doc)" LANGUAGE Javascript
E então teste o gancho tentando excluir uma conta '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
Ganchos JAVA
Um caso de uso comum para OrientDB Hooks (gatilhos) é gerenciar datas de criação e atualização para qualquer uma ou todas as classes. Por exemplo, você pode definir umCreatedDate campo sempre que um registro é criado e definir um UpdatedDate sempre que um registro for atualizado, e faça isso de uma forma em que você implemente a lógica uma vez na camada de banco de dados e nunca precise se preocupar com isso novamente na camada de aplicativo.
Antes de criar, você terá que baixar orientdb-core.jarvisite o seguinte link para baixar o núcleo do OrientDB . E depois copie esse arquivo jar para a pasta onde deseja armazenar o arquivo de origem Java.
Criar arquivo de gancho
Crie um arquivo Java chamado HookTest.java, que testará o mecanismo do Hook usando a linguagem 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;
}
}
O código de exemplo acima imprime o comentário apropriado sempre que você cria ou atualiza um registro dessa classe.
Vamos adicionar mais um arquivo de gancho setCreatedUpdatedDates.java como segue -
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;
}
}
}
O que o código acima faz é procurar qualquer classe que comece com as letras 'r'ou't'e define CreatedDate e UpdatedDate quando o registro é criado e define apenas UpdatedDate toda vez que o registro é atualizado.
Compilar Java Hooks
Compile o código Java usando o seguinte comando. Note: Mantenha o arquivo jar baixado e esses arquivos Java na mesma pasta.
$ jar cf hooks-1.0-SNAPSHOT.jar *.java
Mova o código compilado para onde o servidor OrientDB possa encontrá-lo
Você precisa copiar o arquivo .jar concluído para o diretório onde o servidor OrientDB os procurará. Isso significa o './lib'pasta sob o diretório raiz do servidor OrientDB será semelhante a este -
$ cp hooks-1.0-SNAPSHOT.jar "$ORIENTDB_HOME/lib"
Habilitar gancho de teste no arquivo de configuração do servidor OrientDB
Editar $ORIENTDB_HOME/config/orientdb-server-config.xml e adicione a seção a seguir próximo ao final do arquivo.
<hooks>
<hook class = "HookTest" position = "REGULAR"/>
</hooks>
...
</orient-server>
Reinicie o servidor OrientDB
Depois de reiniciar o OrientDB Server, o gancho que você definiu em orientdb-server-config.xmlagora está ativo. Inicie um console OrientDB, conecte-o ao seu banco de dados e execute o seguinte comando -
INSERT INTO V SET ID = 1;
Se este comando for executado com sucesso, você obterá a seguinte saída.
Ran create hook
Agora execute o seguinte comando -
UPDATE V SET ID = 2 WHERE ID = 1;
Se este comando for executado com sucesso, você obterá a seguinte saída.
Ran update hook
Habilitar Real Hook no arquivo de configuração do servidor OrientDB
Editar $ORIENTDB_HOME/config/orientdb-server-config.xml e altere a seção de ganchos da seguinte forma -
<hooks>
<hook class="setCreatedUpdatedDates" position="REGULAR"/>
</hooks>
...
</orient-server>
Reinicie o servidor OrientDB
Crie uma nova classe que comece com a letra 'r'ou't'-
CREATE CLASS tTest EXTENDS V;
Agora insira um registro -
INSERT INTO tTest SET ID = 1
SELECT FROM tTest
Se este comando for executado com sucesso, você obterá a seguinte saída.
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |1 |1427597275 |1427597275
----+-----+------+----+-----------+-----------
Mesmo que você não tenha especificado valores para definir para CreatedDate e UpdatedDate, O OrientDB configurou esses campos automaticamente para você.
Em seguida, você precisa atualizar o registro usando o seguinte comando -
UPDATE tTest SET ID = 2 WHERE ID = 1;
SELECT FROM tTest;
Se este comando for executado com sucesso, você obterá a seguinte saída.
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |2 |1427597275 |1427597306
----+-----+------+----+-----------+-----------
Você pode ver que o OrientDB mudou o UpdatedDate mas deixou o CreatedDate permanece inalterado.
Os Ganchos OrientDB Java podem ser uma ferramenta extremamente valiosa para ajudar a automatizar o trabalho que você teria que fazer no código do aplicativo. Como muitos DBAs nem sempre são especialistas em Java, esperamos que as informações contidas neste tutorial dêem a você uma vantagem inicial e façam você se sentir confortável com a tecnologia, capacitando-o para criar triggers de banco de dados com êxito conforme a necessidade.