-
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 "operação" 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",
-
não é, 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_código, p_operação, p_antigo, p_novo",
-
Tá, eu tenho até um "PRAGMA
AUTONOMOUS_TRANSACTION" aqui
-
para que eu tenha certeza que a "Trigger" vai
poder executá la com sucesso.
-
E aqui está a operação em si,
-
"INSERT INTO auditoria", as "5"
informações em si,
-
as "4" primeiras,
-
"4" 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"
aí para me dar essa informação.
-
Então, eu vou criar "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",
-
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, eu vou fazer uma alternância,
-
então, tem um "case" bem aqui,
-
no momento que eu tiver inserindo,
-
então o "INSERTING" eu vou
chamar o "registra",
-
passando o código do novo funcionário,
-
o qual é a ação que eu quero registrar,
o "INSERT',
-
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 um apagar.
-
E aqui eu vou executar,
-
portanto vou criar então,
essa minha, "Trigger",
-
muito bem, então eu criei uma "Trigger"
-
que a grande lógica por trás
dessa "Trigger"
-
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 para ter certeza
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 novo funcionário,
-
eu estou inserindo aqui,
ele vai ser código 1000
-
e ele vai ter o salário de R$ 2780,00
reais portanto.
-
Quando eu clico aqui,
repare que uma linha foi inserida
-
e além da linha Sinceridade,
permita me mostrar aqui
-
a tabela de funcionários com esse
novo funcionário em que no igual a 1000.
-
Então
-
esse cara 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 aqui.
-
Repare que além da inserção na tabela,
então de funcionar
-
essa linha que não existia,
ele também deu insert.
-
Ele disparou insert automático
na minha tabela de auditoria.
-
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, portanto eu vou
-
então atualizar o salário
desse mesmo funcionário.
-
Pronto, minha autorização atualizada
eu vou olhar
-
agora na tabela de funcionário
e repare que eu dobrei o salário dele.
-
O salário era de 2180, se tornou 5560,
agora do mesmo cara número 1000.
-
E agora na tabela de auditoria
-
eu tenho registrado não
só o momento que eu inserir 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 então a demonstração,
por que não aproveitar
-
e apagar esse funcionário
que eu acabei de criar?
-
Então um empinou aqui igual a 1000
-
e vou
-
apagar esse funcionário,
portanto está apagado
-
e na tabela
aqui no select asterisco auditoria.
-
Repare que eu tenho
as três operações registradas o momento,
-
conhecer o funcionário, o momento que eu
atualizei e o momento que eu o removi.
-
Então eu consigo.
-
Aqui tem informação e aqui no código
eu consigo saber exatamente quem foi, né?
-
Então sempre essas três operações
aconteceram pro 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 não, 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.