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:
- O nome da trigger
- A Tabela para a qual a Trigger irá ser criada
- Quando a Trigger deverá ser disparada (INSERT, DELETE, UPDATE);
- 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 (
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.