Return to Video

vimeo.com/.../271920829

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

Portuguese, Brazilian subtitles

Revisions Compare revisions