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.
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.
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)
);
|
id
|
nm_login
|
ds_senha
|
fg_bloqueado
|
nu_tentativa_login
|
data_exclusao
|
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;
|
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.
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
|
id
|
nm_login
|
ds_senha
|
fg_bloqueado
|
nu_tentativa_login
|
data_exclusao
|
2
|
joao
|
123456
|
false
|
0
|
2011-11-11
21:01:49.906
|
Abraço!