Olá, vamos falar hoje sobre Triggers ou Gatilhos.
Irei realizar esse post de acordo com o banco de dados que pertence a este elefante abaixo, espero que vocês saibam de qual banco se trata!
Uma funções de gatilho possui um recurso muito útil quando estamos falando de bancos de dados pois pouco utilizam as Triggers devido a complexidade.
Bom, existem inúmeras formas para se realizar e implementar funções de gatilho. Algumas de uma forma um
pouco diferente uns dos outros.
Vamos criar um seguinte exemplo e vamos identificar como funciona os gatilhos no SGBD PostgreSQL.
Sempre uma função de gatilho pode ser criada para executar antes (BEFORE) ou
após (AFTER) as consultas INSERT, UPDATE OU DELETE, uma vez para cada
registro (linha) modificado ou por instrução SQL. Logo que ocorre um
desses eventos do gatilho a função do gatilho é disparada
automaticamente para tratar o evento.
No que diz respeito a declaração de um gatilho, para o banco
PostgreSQL, sempre devemos atrelar uma FUNÇÃO ao gatilho, enquanto nos
demais bancos de dados, o algoritmo a ser executado fica no corpo da
declaração do gatilho.
Sintaxe de um TRIGGER em PostgreSQL:
CREATE TRIGGER nome { BEFORE | AFTER } { evento [ OR ... ]
ON tabela [ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE
nome_da_funcao ()
|
Sempre devemos declarar quando a trigger deve ser disparada: antes (BEFORE) ou após (AFTER) um evento (INSERT, UPDATE, DELETE ou SELECT) em determinada tabela, para cada linha (ROW) ou instrução (STATEMENT), e qual função (PROCEDURE) deve ser executada.
Como ficaria no banco de dados:
A tabela de usuários
id
|
nm_login
|
ds_senha
|
fg_bloqueado
|
nu_tentativa_login
|
1
|
hallan
|
hallan2011
|
false
|
0
|
2
|
joao
|
123456
|
false
|
0
|
3
|
maria
|
abcd1234
|
false
|
2
|
Vamos usar sempre que um usuário for excluído, guardar as suas informações em uma tabela reserva.
SQL para
a criação da tabela de backup:
CREATE TABLE bkp_usuario (
id integer NOT NULL,
nm_login character varying,
ds_senha character varying,
fg_bloqueado boolean,
nu_tentativa_login
integer,
data_exclusao
timestamp,
CONSTRAINT pk_bkp_usuario
PRIMARY KEY (id)
);
|
Temos, então,
a seguinte tabela, chamada bkp_usuario:
id
|
nm_login
|
ds_senha
|
fg_bloqueado
|
nu_tentativa_login
|
data_exclusao
|
O próximo
passo então é criar a função que será disparada toda vez que um usuário for
excluído. Apesar de ser um exemplo simples, serve para o entendimento de um
gatilho.
Podemos
criar, então, a função da seguinte forma:
CREATE OR REPLACE FUNCTION backup_usuario()
RETURNS TRIGGER AS
$$
BEGIN
INSERT INTO bkp_usuario
(id, nm_login, ds_senha, fg_bloqueado,
nu_tentativa_login, data_exclusao)
VALUES
(OLD.id, OLD.nm_login, OLD.ds_senha,
OLD.fg_bloqueado, OLD.nu_tentativa_login, NOW()
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
|
A palavra
reservada OLD representa o registro antigo (para o caso de um update ou
um delete). No corpo da função, estamos apenas lendo os dados do registro
antigo e efetuando um insert na tabela de backup. A função NOW() retorna
a data e hora atual do sistema.
Com a
função pronta, devemos criar o gatilho que fará ela ser disparada toda vez que
ocorrer um comando de DELETE na
tabela de usuários.
Devemos
criar o gatilho da seguinte forma:
CREATE TRIGGER trigger_usuario AFTER DELETE
ON usuario
FOR EACH ROW
EXECUTE PROCEDURE backup_usuario();
|
Nosso gatilho será disparado sempre depois de um comando de exclusão (AFTER DELETE) na tabela de usuário, e para cada linha (FOR EACH ROW) executa a função (EXECUTE PROCEDURE) backup_usuario.
Desta
forma, se efetuarmos a seguinte instrução:
Delete from usuario where id=2;
A tabela de usuário ficará da seguinte forma:
Delete from usuario where id=2;
A tabela de usuário ficará da seguinte forma:
id
|
nm_login
|
ds_senha
|
fg_bloqueado
|
nu_tentativa_login
|
1
|
hallan
|
hallan2011
|
false
|
0
|
3
|
maria
|
abcd1234
|
false
|
2
|
E a
tabela bkp_usuario ficará da seguinte forma:
id
|
nm_login
|
ds_senha
|
fg_bloqueado
|
nu_tentativa_login
|
data_exclusao
|
2
|
joao
|
123456
|
false
|
0
|
2011-11-11
21:01:49.906
|
Bom acho
que deu para entender quando é executado este gatilho somente quando ocorre a
exclusão de registro na tabela de usuários. E logo em seguida ele acaba realizando
automaticamente o insert na outra tabela backup usuários onde com os registros
e a data atuação da execução do gatilho.
Abraço!
Abraço!