Triggers – Oracle ou SqlServer – Banco de Dados 2

Triggers

Triggers são blocos de código (PL/SQL, Transact-SQL, …) armazenados dentro do banco de dados, que são executados automaticamente pelo banco toda vez que uma instrução SQL (evento DML) for aplicada para uma tabela específica.

Aplicações das triggers:

  • Segurança e Integridade – Pode-se utilizar Triggers para garantir uma segurança maior no banco, pois elas podem restringir o acesso às tabelas e controlar as atualizações;
  • Auditoria – como dito anteriormente, as Triggers são executadas automaticamente, assim, podem sem utilizadas para fazer auditoria sobre acesso ao banco de dados;
  • Replicação de Dados – são excelentes para criar uma política de replicação síncrona de uma tabela para outra;
  • Integridade – a partir das Triggers podem ser criados controles mais complexos para os relacionamento das tabelas;
  • Controle de dados – Caso uma tabela tenha dados, cujo valor depende de outras tabelas, uma Trigger pode atualizar automaticamente a coluna com os valores derivados.

Dicas e precauções:

  • Use triggers para garantir a execução de comandos para uma tabela específica;
  • Evite criar triggers que dupliquem regras já definidas em CONSTRAINTS do banco;
  • ATENÇÃO: cuidado ao criar as triggers que disparem por uma instrução em uma tabela, para que ela não efetue a mesma operação na própria tabela porque isso iria disparar a trigger N vezes, travando a execução.

Em síntese, triggers são usadas para realizar tarefas relacionadas com validações, restrições de acesso, rotinas de segurança e consistência de dados, etc. Desta forma, estes controles deixam de ser executados pela aplicação e passam a ser executados pelas triggers em determinadas situações, tais como:

  • Mecanismos de validação envolvendo múltiplas tabelas;
  • Criação de conteúdo de uma coluna derivada de outras colunas da tabela;
  • Realizar análise e atualizações em outras tabelas com base em alterações e/ou inclusões da tabela atual;

Quando você for criar uma Trigger deverá definir:

  1. O nome  da trigger
  2. A Tabela para a qual a Trigger irá ser criada
  3. Quando a Trigger deverá ser disparada (INSERT, DELETE, UPDATE);
  4. A ação que a Trigger vai executar (geralmente um bloco de código PL/SQL)

A Sintaxe para criação de uma Trigger é a seguinte:

CREATE OR REPLACE TRIGGER nome_trigger 
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON { NOME_TABELA } 
FOR EACH ROW

BEGIN
  Bloco de código PL/SQL
END;
Exemplo 1:

CREATE OR REPLACE TRIGGER OPERACAO_AUDIT
AFTER INSERT ON OPERACAO
FOR EACH ROW
BEGIN
  INSERT INTO AUDITORIA 
    VALUES (SYSDATE, 
            ‘REGISTRO INSERIDO NA TABELA OPERACAO’, 
            ‘NOME_USUARIO’);
END;

Exemplo 2:

CREATE OR REPLACE TRIGGER CONTA_TESTE

AFTER UPDATE OF LIMITE ON CONTA

FOR EACH ROW

BEGIN

RAISE_APPLICATION_ERROR(-20500, ‘Não é possível alterar’);

END;


Pseudo registros :Old e :New

Ao trabalharmos com as Triggers de nível de linha (FOR EACH ROW), utilizamos estes dois pseudo registros, eles servem para fazer as comparações das colunas velhas ( :o ld ) com as novas ( :new ), são muito utilizadas para fazer Update nas colunas.

Exemplo 1:

CREATE OR REPLACE TRIGGER OPERACAO_AUDIT
AFTER UPDATE ON FUNCIONARIO
FOR EACH ROW
BEGIN
  INSERT INTO REG_ALT_SALARIO (DATA, USUARIO, SALARIO_ANT, SAL_ATUAL) 
    VALUES (SYSDATE, ‘NOME_USUARIO’, :OLD.SALARIO, :NEW.SALARIO);
END;

Predicados Condicionais

Está parte das Triggers é bem interessante, pois dentro do corpo das Triggers abrigam três predicados importantes para a utilização de múltiplas instruções DML, são os INSERTING (inserindo), UPDATING (atualizando) e DELETING (excluindo), esses predicados possuem valores lógicos e são iniciados no momento de disparo da Trigger.
Alguns comandos importantes:

Desabilitando e habilitando uma Trigger específica

ALTER TRIGGER nome_da_trigger DISABLE;
ALTER TRIGGER nome_da_trigger ENABLE;

Desabilitando e Habilitando todas as Triggers de uma tabela

ALTER TABLE nome_tabela DISABLE ALL TRIGGERS;
ALTER TABLE nome_tabela ENABLE ALL TRIGGERS;

Compilando uma Trigger

ALTER TRIGGER nome_da_trigger COMPILE:

Eliminando uma Trigger

DROP TRIGGER nome_trigger;

Verificar no dicionário de dados as triggers do usuário

SELECT object_name, 
            object_type 
FROM user_objects 
WHERE object_type = 'TRIGGER';

Obtendo detalhes das triggers

DESC USER_TRIGGERS

Exercícios:
1. Criar uma trigger, chamada atualiza_saldo, para atualizar o saldo da conta corrente toda vez que ser efetuada uma operação (tabela OPERACAO) relacionada à conta.

2. Criar uma trigger, chamada testa_limite, para verificar se o saldo da conta após uma determinada operação de débito não ficará menor que o limite da conta.

3. Criar uma trigger, chamada bloqueia_operacao, que proíba que sejam efetuadas operações de alteração e exclusão na tabela de OPERACAO.
Seguir

Get every new post delivered to your Inbox.