-
Vamos a um outro uso muito
importante das "Triggers",
-
que é para uma função nobre
-
muito utilizada por administradores
de banco de dados,
-
a auditoria do que está acontecendo.
-
Então, eu posso criar uma tabela
que eu chamo de auditoria,
-
e registrar quando alguém cadastrou
alguma coisa, apagou ou removeu,
-
guardando esses dados como
backup, por exemplo,
-
ou simplesmente podemos saber
quem é que apagou o que e quando.
-
São informações muito importantes,
-
então, eu posso utilizar
a "Trigger" para isso.
-
Vamos a um exemplo.
-
Eu tenho um exemplo aqui pronto
para nós brincarmos, então.
-
Vou criar tabela de auditoria,
portanto, agora no início,
-
essa tabela vai guardar o "codigo"
-
a "hora" que esta ação aconteceu,
-
qual é a "operacao" em si,
-
a antiga informação e a nova.
-
Como eu mencionei, eu poderia
até mesmo guardar o usuário que fez isso,
-
mas eu vou manter, então, o exemplo
exatamente como estava,
-
vou criar aqui a tabela de auditoria.
-
Muito bem, a tabela criada.
-
E agora eu vou criar uma "PROCEDURE",
-
então, na sequência aqui
eu vou criar uma "PROCEDURE"
-
para dar uma automatizada nessa operação.
-
E com a "PROCEDURE" eu também posso
-
burlar, de certa maneira, se é que
burlar é a palavra correta,
-
mas eu posso com a "PROCEDURE"
fazer o "COMMIT" desse "INSERT",
-
eu posso registrar de fato
o que está acontecendo,
-
já que a "TRIGGER" me impede de chamar
esse tipo de operação dentro do seu corpo.
-
Então, nós vamos criar
uma "PROCEDURE" antes
-
que vai registrar a operação
na tabela de auditoria,
-
então, eu tenho aqui um "CREATE OR
REPLACE PROCEDURE registra",
-
"p_codigo, p_operacao, p_antigo, p_novo".
-
Eu tenho até um "PRAGMA
AUTONOMOUS_TRANSACTION" aqui
-
para que eu tenha certeza que a "TRIGGER"
vai poder executar com sucesso.
-
E aqui está a operação em si,
-
"INSERT INTO auditoria", as cinco
informações em si,
-
as quatro delas eu vou passar
como parâmetro,
-
mas uma delas eu não preciso,
-
uma delas é a data e hora atuais,
-
e aí eu apelo para o "SYSDATE"
para me dar essa informação.
-
Então, eu vou criar a "PROCEDURE",
vamos lá.
-
Procedimento criado, esse procedimento
então, vai registrar informação,
-
deixa eu trazer o "SET SERVEROUTPUT ON"
para baixo.
-
E agora sim eu vou
fazer a "TRIGGER".
-
Então, um "CREATE OR REPLACE
TRIGGER mudancas_salariais",
-
vou chamar sempre antes de "INSERT"
ou "UPDATE" ou mesmo "DELETE"
-
informações da tabela de empregados,
-
que é uma tabela sensível, tem
salários e tudo mais.
-
E para cada linha que
eu for fazer uma mudança,
-
eu vou fazer o seguinte procedimento,
-
eu vou fazer uma alternância,
-
então, tem um "CASE" bem aqui,
-
no momento que eu estiver inserindo,
então, o "INSERTING",
-
eu vou chamar o "registra",
-
passando o código do novo funcionário,
-
qual é a ação que eu quero registrar?
-
O "INSERTING".
-
A inserção, o ":OLD.sal" e o ":NEW.sal",
-
embora, como é um "INSERTING",
eu não tenho o antigo aqui,
-
essa informação vai ficar
zerada no final das contas.
-
O "UPDATING",
e a única diferença aqui
-
é que eu vou pegar código
antigo como referência,
-
e vai ser um "UPDATE"
e não uma "INSERT".
-
E no "DELETING", eu tenho
praticamente a mesma linha,
-
a diferença é que eu vou registrar
que a ação que aconteceu
-
foi uma remoção,
foi apagar.
-
E aqui eu vou executar,
-
portanto, vou criar
essa minha "TRIGGER".
-
Muito bem, então eu criei uma "TRIGGER",
-
a grande lógica por trás dessa "TRIGGER"
é que na verdade é uma "PROCEDURE",
-
e ela está sendo chamada
aqui no "registra".
-
Então, eu posso, portanto, ter uma
"TRIGGER" chamando "PROCEDURE",
-
não tem problema nenhum.
-
E agora sim eu vou fazer um teste,
-
então, eu tenho o "SET SERVEROUTPUT ON",
-
embora nesse exemplo ele se torne
desnecessário no final das contas.
-
Eu vou colocar para ter certeza
de alterar o formato da data
-
para um formato mais amigável
aqui no Brasil,
-
então, isso aqui é só para eu poder ter
a data e hora no formato mais interessante,
-
pronto, alterado.
-
E agora eu vou inserir um
novo funcionário,
-
eu estou inserindo aqui,
ele vai ser o código "1000",
-
e ele vai ter o salário
de R$2780,00 reais.
-
Quando eu clico aqui,
repare que uma linha foi inserida
-
e, além da linha inserida,
-
permita-me mostrar aqui
a tabela de funcionários
-
com esse novo funcionário,
"empno=1000".
-
Então, essa pessoa que eu acabei
de inserir também aqui,
-
repare que eu não passei
as outras informações,
-
eu só tenho o código e o salário
no final das contas,
-
que é o que interessa para a minha
"PROCEDURE" de auditoria.
-
Então, vou dar um
"SELECT * FROM auditoria",
-
repare que além da inserção
na tabela de funcionários,
-
essa linha aqui não existia,
-
ele também deu "INSERT",
-
ele disparou um "INSERT" automático
na minha tabela de auditoria.
-
O código "1000",
-
essa data e hora que eu acabei
de fazer a função, "INSERT",
-
o antigo salário não existe
e o novo salário é "2780".
-
Eu posso fazer um "UPDATE",
-
eu vou, então, atualizar
o salário desse mesmo funcionário.
-
Pronto, linha atualizada.
-
Eu vou olhar agora na
tabela de funcionário
-
e repare que eu dobrei
o salário dele.
-
O salário era de R$2.780 reais,
-
se tornou R$5.560 reais
agora da mesma pessoa "1000".
-
E agora na tabela de auditoria
-
eu tenho registrado não só o momento
que eu inseri o funcionário,
-
mas também o momento com data,
hora, minuto, tudo certinho
-
de quando eu mudei o salário dele,
quando eu dobrei o salário dele.
-
E pra terminar a demonstração,
por que não aproveitar
-
e apagar esse funcionário
que eu acabei de criar?
-
Então, um "empno = 1000"
-
e vou apagar esse funcionário,
portanto, está apagado.
-
E na tabela aqui no
"SELECT * FROM auditoria",
-
repare que eu tenho as três
operações registradas,
-
o momento que eu inseri o funcionário,
-
o momento que eu atualizei
-
e o momento que eu o removi.
-
Então, eu consigo ter a informação
-
e no código eu consigo saber
exatamente quem foi, não é?
-
Então, essas três operações
aconteceram para o meu empregado "1000".
-
Então, repare como acaba sendo simples
de criar uma tabela de auditoria
-
e dentro dessa tabela, portanto,
eu posso guardar qualquer informação,
-
para depois fazer algum tipo de acareação
ou saber se alguém apagou por engano,
-
ou deu um aumento de salário
que fosse indevido,
-
eu consigo, portanto, ter uma boa visão
-
do que acontece dentro
do meu banco de dados.