BDA - Triggers

Revisão de 17h53min de 26 de agosto de 2013 por Lclaudio (discussão | contribs) (Criou página com '= Triggers = <br> * Triggers, ou gatilhos são stored procedures em PL/SQL ou Java executadas (disparadas) implicitamente * Não possuem nenhum “chamamento” explícito,...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)

Triggers



  • Triggers, ou gatilhos são stored procedures em PL/SQL ou Java executadas (disparadas) implicitamente
  • Não possuem nenhum “chamamento” explícito, sempre que uma tabela ou view é modificada ou ainda quando acontece alguma determinada ação do usuário ou até mesmo ações do próprio banco de dados.
  • Triggers são uma parte crítica de qualquer aplicação bem modelada e, através deles, é possível garantir as seguintes funcionalidades:
    • Executar validações de alterações feitas em tabelas ou views: triggers oferecem uma forte garantia na validação de informações, pois esta validação está ligada diretamente ao objeto do banco de dados (tabela ou view)
    • Automatizar manutenções no banco de dados: a partir da versão 8i, é possível associar triggers a eventos do banco de dados, como uma inicialização (startup), permitindo executar tarefas de limpeza na inicialização, por exemplo
    • Aplicar regras a respeito de atividades de administração de uma maneira extremamente granular: pode-se usar triggers para controlar qual o tipo de alteração que se pode fazer em determinado objeto, como apagar (drop) ou alterar uma tabela.


  • Tipos de eventos que podem “disparar” um trigger:
    • DML (Data Manipulation Language): sempre que um evento do tipo insert, update ou delete ocorrer na tabela, o trigger será “disparado”
    • DDL (Data Definition Language): o trigger será disparado sempre que um evento DDL ocorrer, como a criação de uma tabela. É muito útil para o caso de auditorias ou para evitar que certas operações sejam executadas
    • Eventos do banco de dados: eventos como startup, shutdown, sempre que um usuário conectar-se ou desconectar-se e até mesmo sempre que um erro Oracle ocorrer, o trigger será “disparado”
    • INSTEAD OF: Instead of (em vez de) triggers são uma ótima alternativa aos triggers de DML, pois eles são “disparados” quando um evento do tipo insert, update ou delete estão para acontecer. O código do trigger define o que deverá acontecer no lugar dos eventos. Este tipo de trigger controla operações em views, não em tabelas;


  • Triggers facilitam o desenvolvimento de aplicações a maioria dos bancos de dados relacionais possui uma técnica chama Trigger que é utilizada para poder colocar uma determinada regra de negócio da aplicação
  • Os Triggers padrão são Stored Procedures que são disparadas automaticamente quando uma operação como um
    • INSERT
    • UPDATE
    • DELETE
  • é efetuado sobre uma tabela
  • Logo após a aplicação cliente enviar algum destes comandos para o banco, o respectivo Trigger é disparado
  • Um Trigger padrão ocorre depois de algumas verificações do SQL, mas ainda podemos prevenir a ação que executou o Trigger se utilizarmos a instrução ROLLBACK, pois o SQL Server automaticamente inicia uma transação para instruções do tipo INSERT, UPDATE ou DELETE ( transação implícita )
  • Supondo que tenhamos esta tabela criada em um banco do SQL Server:
CREATE
TABLE DBO.TESTE
(
COD INT
)

Um Trigger de INSERT pode ser criado da seguinte maneira:

CREATE
TRIGGER T_INCLUI ON TESTE
FOR
INSERT 
AS 
SELECT
‘DADOS A SEREM INSERIDOS:’
SELECT
* FROM INSERTED
GO
  • Dentro de um Trigger de INSERT podemos utilizar a tabela temporária INSERTED (que o SQL Server cria somente durante o Trigger) para visualizarmos os dados que estão sendo inseridos.
  • Se utilizarmos esta instrução:
INSERTINTO TESTE VALUES(1)

  • O Trigger será disparado e mostrará o valor 1 para o campo COD da tabela INSERTED.
  • Um exemplo de um Trigger de DELETE:
CREATE
TRIGGER T_APAGA ON TESTE
FOR 
DELETE
AS
SELECT
‘DADOS A SEREM APAGADOS:’
SELECT
* FROM DELETED
GO
  • Ao invés de utilizarmos a tabela temporário INSERTED utilizamos a tabela temporária chamada DELETED, com os dados que serão apagados.
  • Um Trigger de UPDATE:
CREATE
TRIGGER T_ALTERA ON TESTE
FOR 
UPDATE
AS
SELECT
‘DADOS ANTIGOS:’
SELECT
* FROM DELETED
SELECT
‘DADOS NOVOS:’
SELECT
* FROM INSERTED
GO
  • Temos duas tabelas temporárias: a tabela DELETED, com os valores antigos para o campo, e a tabela INSERTED com os novos valores para os campos da tabela.
  • Supondo que para qualquer instrução INSERT, UPDATE ou DELETE efetuada sobre a tabela TESTE seja cancelada:
CREATE
TRIGGER T_CANCELA ON TESTE
 FOR
INSERT , UPDATE , DELETE
AS
SELECT ‘CANCELANDO AÇÃO.’


ROLLBACK
GO
  • Dicas para Triggers:
    • Pode-se ter mais de um Trigger do mesmo tipo para uma mesma tabela. A ordem de execução vai do que foi criado primeira até o último que foi criado.
    • O encadeamente de Trigger (um Trigger chamado outro, ou a si mesmo) pode ocorrer, desde que seja habilitada uma opção do servidor. Por padrão esta opção é habilitada.
    • Triggers nas regras de negócio devem ser usados sem abus. Para verificações mais simples, pode-se utilizar outros objetos do Banco de dados, como constraints
    • Triggers podem ser utilizados para replicação (cópia dos dados). Por exemplo: a cada vez que o usuário inserir um dados, você insere em outra tabela.
    • Triggers não podem ser chamados manualmente como Stored Procedures. Eles são chamados somente pela instrução determinada pelo tipo do Trigger.
    • Existem os novos Trigger INSTEAD OF que funcionam um pouco diferente dos Triggers padrão. Eles substituem a instrução que os disparou.