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.